汇编语言复习摘要五——[BX] and loop
1. [bx]:[0]表示一个内存单元,其地址为:ds:0。同样道理,[bx]也是表示一个内存单元,偏移地址在寄存器bx中。
比如:mov ax, [bx]:bx中存放的数据作为偏移地址,把一个内存单元送入ax中。
mov [bx], ax:跟上面一样道理,只是把ax的内容送入内存单元[bx]中。
2. Loop指令:Loop指令用于循环,其执行分为两个步骤进行:
1) (cx) = (cx) - 1;(cx)表示的cx中的值;
2) 判断cx中的值是否等于0,如果不等于0,继续循环执行;如果等于0,执行下面的指令;
例子:计算2 ^ 10:
assume codesg
codesg segment
mov ax, 0
mov cx, 10
s: add ax, 2
loop s
mov ax, 4c00H
int 21H
codesg ends
end
在上面的例子中,s其实是一个地址,loop s 即把IP的值设置为s的地址值。
3. Debug和masm对指令的不同处理
这个问题其实我感觉有点尴尬,见下面的例子:
mov ax, 2000h
mov ds, ax
mov al, [0]
mov bl, [1]
mov cl, [2]
mov dl, [3]
在debug中,这段代码的mov al, [0]等指令是这样执行的:mov al, ds:[0];但是反过来看看masm的处理方式,是:
mov al, 00h。所以,程序中,你能通过两种方式解决这个问题:
1) mov dx, 00
mov ax, [dx] ;这个是通过寄存器来实现的,比较麻烦,因为多了一步
2) mov ax, ds:[0] ;这个是通过执行数据段地址来实现的
4. 段前缀:mov ax, ds:[0] ; mov ax, ss:[0] ; mov ax, es:[0]; 冒号前面的用于显示指明内存单元的段地址,在汇编语言中称作为:段前缀。

浙公网安备 33010602011771号