一、[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* 轉移