一、[BX]和loop指令
直接来解释下这两个指令吧!我们知道[0]可以表示偏移量为0的内存单元(段地址存在CS里),[BX}则提供了更为灵活的方式,即mov ax, [bx]的功能是寄存器bx中存放的数据作为一个便宜地址EA,段地址SA默认在ds中,将SA:EA处的数据送入ax中,即(ax)=((ds)*16+(bx)),()表示寄存器中的值。实际上,[]就表示一个内存单元,其中的数值或寄存器则表示了偏移量的来源。
loop指令是循环指令,格式是loop 标号。当CPU执行loop命令时需要执行两步操作:1)(cx) = (cx)-1; 2) 判断cx中的值,不为零时则转至标号处执行循环体语句。比如程序:
assume cs:code
code segment
mov ax, 2
mov cx, 11
s: add ax, ax
loop s
mov ax, 4c00h
int 21h
code ends
end
二、and与or指令
and指令即逻辑按位与操作,利用此操作可以将操作对象的相应位设为0,其他位不变:
mov al, 01100011B
and al, 00111011B
al = 00100011B //执行后
or指令即逻辑按位或操作,利用此操作可以将操作对象的相应位设为1,其他位不变:
mov al, 01100011B
or al, 00111011B
al = 01111011B
除了[A-D]X的四个通用寄存器之外,还有与bx功能相近的两个寄存器:si与di,si与di不能够分成两个8位寄存器来使用,其余功能类似,比如:
mov bx, 0
mov ax, [bx]
mov si, 0
mov ax, [si]
mov bx, 0
mov ax, [bx+123]
mov si, 0
mov ax, [si+123]
mov di, 0
mov ax, [di+123]
mov di, 0
mov ax, [di]
三、转移指令
可以修改IP,或同时修改CS和IP的指令统称为转移指令。8086CPU的转移行为有两类:
-1. 只修改IP,称为段内转移,如:jmp ax;
-2. 同时修改CS和IP,称为段外转移,如:jmp 1000:0;
至于call和ret指令,其实也是转移指令,从执行效果上看:
-1. CPU执行ret指令时,相当于进行:pop IP;
-2. CPU执行retf指令时,相当于进行:pop IP; pop CS;
当CPU执行call指令时,进行两步操作:
-1* 将当前的IP或CS和IP一起压入栈中;
-2* 转移