1. [bx]和内存单元的描述
[0]表示偏移地址为0
[bx]表示偏移地址在bx中
mov ax,[bx] 表示 将一个长度为2字节的内存单元内容送入ax
mov al,[bx] 表示将一个长度为1字节的内存单元内容送入al
2. loop
loop表示循环
3. 我们定义的描述性的符号:“()”
使用描述性的符号"()"表示一个寄存器或一个内存单元中的内容。
(ax)表示ax中的内容
(al)表示al中的内容
(20000H)表示内存20000H单元中的内容(()中的内存单元的地址为物理地址);
((ds)*16+(bx)) 表示 (ds)*16+(bx) 地址单元的内容。
(X) 表示的数据有两种类型:
- 字节
- 字
4. 约定符号idata表示常量
用idata表示常量 1/2/3/4/…
就好比 mov ax,[idata] 代表 mov ax, [1]、mov ax,[2]、mov ax,[3]
mov bx,idata 代表 mov bx,1、mov bx, 2、mov bx,3。
5.1 [BX]
mov ax,[bx] ;将ds:bx中的字 给 ax
mov [bx],ax ;将ax中的值 赋值给 ds:bx
问题 5.1
21002H BE
21003H 00
21004H BE
21005H BE
21006H BE
21007H
5.2 Loop指令
CPU执行LOOP指令的时候
- (CX)=(CX)-1;
- 判断CX中的值,不为零则转至标号处执行程序。如果为0则向下执行。所以cx中的是循环次数。
;计算2^12
assume cs:code
code segment
mov ax,2
mov cx,11 ;设置循环次数
s: add ax,ax
loop s ;c = c-1,然后判断c是否为0,不为零则跳到s标号
mov ax,4c00h
int 21h
code ends
end
问题 5.2, 问题 5.3
assume cs:code
code segment
mov ax,0
mov cx,123
s: mov ax,236
loop s
code ends
end
5.3 在Debug中跟踪用loop指令实现的循环程序
assume cs:code
code segment
mov ax,0FFFFh ;之所以用0开头,是因为汇编源程序中不能用字母开头
mov ds,ax
mov bx,6
mov al,[bx]
mov ah,0
mov dx,0
mov cx,3
s: add dx,ax
loop s
code ends
end
当我们运行循环时,如果使用 t 指令。当 cx 过大时,需要重复操作多次。所以使用 p 直接跳过循环。
也可以使用g XXXX ,跳到XXXX偏移地址上。
5.4 Debug 和 汇编编译器 masm 对指令的不同处理
像 mov ax,[0],这样的表示将ds:0 被 编译器变成 mov ax,0.
所以 可以 用的方式:
mov bx, 0
mov ax, [bx]
;也可以
mov ax, ds:[0] ;如果没有在[]前没有加上ds,[idata]会变成idata.
5.5 loop 和 [bx]的联合应用
assume cs:code
code segment
mov ax,0ffffh
mov ds,ax
mov dx,0
mov bx,0
mov cx,12
s: mov al,[bx]
mov ah,0
add dx,ax
inc bx
loop s
mov ax,4c00h
int 21
5.6 段前缀
ds, cs, ss, es 都是段前缀
mov ax,ds/cs/ss/es : [ bx ]
5.7 一段安全的空间
为了避免覆盖其他区域的数据:
在一般的PC下,DOS方式下,DOS和其他合法程序一般不会使用使用0:200-0:2ff(00200h-002ffh)的256个字节的空间。我们使用这段空间是安全的。
在通过ds:[idata]转运数据时候,为了不在两地切换ds,另一地使用段前缀——es.
assume cs:code
code segment
mov ax,0ffffh
mov ds,ax
mov ax,0020h
mov es,ax
mov cx,12
s: mov dl,[bx]
mov es:[bx],dl ;这样就不必再重复设置ds了
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end
实验4 [bx] 和 loop的使用
(1)、(2)
assume cs:code
code segment
mov ax,0020h
mov ds,ax
mov bx,0
mov cx,2fh
s: mov [bx],bx
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end
(3)
mov cx,0015h
mov ax,076a