一、[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 //执行后
点击(此处)折叠或打开
- mov al, 01100011B
- or al, 00111011B
- al = 01111011B
点击(此处)折叠或打开
- mov bx, 0
- mov ax, [bx]
- mov si, 0
- mov ax, [si]
- mov di, 0
- mov ax, [di]
点击(此处)折叠或打开
- mov bx, 0
- mov ax, [bx+123]
- mov si, 0
- mov ax, [si+123]
- mov di, 0
- mov ax, [di+123]
三、转移指令
可以修改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* 转移
PS:好了,汇编的基础暂时告一段落,但是资料还是放在案头,学习的过程中有不懂的随时来查阅补充了。