1.邏輯運算指令
8086/8088指令系統的邏輯運算指令有“與”(AND)、“測試”(TEST)、“或”(OR)、“異或”(XOR)和“非”(NOT)五條。
除了“非”指令對狀態標誌位不產生影響外,其餘四條指令對狀態標誌位均有影響。這些指令將根據各自邏輯運算的結果影響SF、ZF和PF狀態標誌位,同時將CF和OF置“0”,但AF的值不確定。
(1)邏輯“與”指令
指令格式: AND DST,SRC
功 能: DST←DST∧SRC
操作說明: AND指令將目的操作數和源操作數按位進行邏輯“與”運算(即相“與”的兩位均爲1時結果爲1,否則爲0),將結果送回目的操作數。指令中目的操作數可以是寄存器或存儲器,源操作數可以是立即數、寄存器或存儲器。但是指令的兩個操作數不能同時是存儲器。
作 用: AND指令可以有選擇地屏蔽某些位(有選擇地清0),而保留另一些位不變。
【例2.32】 AND AL,3CH ;8位二進制分別進行與運算
AND AX,BX ;16位二進制分別進行與運算
AND DX,BUFFER[SI]
AND [DI],CX
【例2.33】 MOV AL,1011010lB ;AL=1OllOl01B
AND AL,0FH ;AL=00000101B,保留低四位,高四位清0
(2)測試指令
指令格式: TEST DST,SRC
功 能: DST ∧ SRC
操作說明: TEST指令將目的操作數和源操作數按位進行邏輯“與”運算,但邏輯運算的結果不送回目的操作數,即僅做DST∧SRC運算,兩個操作數的內容均保持不變,但運算結果影響狀態標誌位。
作 用:TEST指令常常用於位測試,它與條件轉移指令一起,共同完成對特定位狀態的判斷,並實現相應的程序轉移。
【例2.34】 測試AL的最高位是否爲零,若不爲零,則轉移到NEXT。
TEST AL,10000000B
JNZ NEXT
┆
NEXT: ……
(3)邏輯“或”指令
指令格式: OR DST,SRC
功 能: DST←DST∨SRC
操作說明: 將目的操作數和源操作數按位進行邏輯“或”運算(即相“或”的兩位中任一位爲1時結果爲1,只有兩位都爲0時結果才爲0),並將結果送回目的操作數。
作 用: OR指令操作數的類型與AND指令相同。OR指令可將寄存器或存儲器中的某些特定的位設置成“1”,同時使其餘位保持原來的狀態不變。
【例2.35】 若將AL寄存器的最高位置“1” ,而保持其餘位不變時,可用如下指令:
OR AL,10000000B ;AL←AL∨(10000000B)
(4)邏輯“異或”指令
指令格式: XOR DST,SRC
功 能: DST←DST⊕SRC
操作說明: XOR指令將目的操作數和源操作數按位進行邏輯“異或”運算(即相“異或”的兩位數不相同時結果爲“1”,相同時則爲“0”),並將結果送回目的操作數。XOR指令操作數的類型與AND、OR指令均相同。
作 用: XOR指令可將寄存器或存儲器中的某些特定的位“求反”,而使其餘位保持不變。XOR指令的另一個用途是將寄存器的內容清0。XOR指令和AND、OR等指令一樣,也會將進位標誌CF清0。
【例2.36】 使AL寄存器中的第1、3、5、7位求反,第0、2、4、6位保持不變,可將AL和10101010B(即OAAH)“異或”。
MOV AL,0FH ;AL=0FH
XOR AL,10101010B ;AL=1O1OOl01B(0A5H)
【例2.37】 XOR AX,AX ;將AX清0,同時將CF清0
(5)邏輯“非”運算
指令格式: NOT DST
功 能: DST←
操作說明: NOT指令使目的操作數按位取反,即其中所有“0”的位變爲“1”,所有“1”的位變爲“0”。其操作數可以是8位或16位的寄存器或存儲器,但不能對立即數執行邏輯“非”操作。
【例2.38】 NOT AH
NOT WORD PTR[BX][DI]
2.移位指令
8086/8088指令系統的移位指令可以向左或向右移位,移位次數由COUNT決定,COUNT爲1時移動一位,可直接寫於指令中。要求移多位時,移動位數必須事先放在CL寄存器中。移位指令影響除AF外的其他狀態標誌位。
(1)邏輯左移指令
指令格式: SHL DST,COUNT
操作說明:SHL指令將目的操作數順序向左移1位或移CL寄存器中指定的位數。左移1位時,操作數的最高位MSB移入進位標誌CF,最低位LSB補0,相當於無符號數乘上2。
【例2.39】 MOV AH,8BH
MOV CL,3
SHL AH,CL ;SI內容左移3位
(2)邏輯右移指令
指令格式: SHR DST,COUNT
操作說明: SHR將目的操作數順序向右移1位或移CL寄存器中指定的位數。低位移入CF,高位補0。無符號數右移1位相當於除以2。
【例2.40】 MOV BL,20H ;BL=20H
SHR BL,1 ;BL=10H
(3)算術左移指令
指令格式:SAL DST,COUNT
操作說明:SAL指令將目的操作數順序向左移1位或移CL寄存器中指定的位數。操作與SHL完全相同。
【例2.41】SAL WORD PTR[BX+50],1
(4)算術右移指令
指令格式:SAR DST,COUNT
操作說明:SAR指令將目的操作數向右移1位或由CL寄存器指定的位數。右移一位時,操作數的最低位LSB移入進位標誌CF,最高位MSB保持不變。對帶符號數算術右移一位相當於將該數除以2。
【例2.42】
SAR AL,1
SAR DI,CL
SAR WORD PTRTABLE[SI],1
SAR BYTE PTR[BX],CL
4.循環移位指令
8086/8088指令系統有四條循環移位指令,包括不帶進位和帶進位循環移位。指令中指定的左移或右移的位數COUNT可以是1或由CL寄存器指定。所有循環移位指令都隻影響進位標誌CF和溢出標誌OF。
(1)循環左移指令
指令格式: ROL DST,COUNT
操作說明: ROL指令將目的操作數順序向左移1位或移CL寄存器中指定的位數。左移1位時,操作數的最高位MSB移入進位標誌CF的同時,還移到最低位LSB形成循環,進位標誌位不在循環環內。
【例2.43】 ROL AH,1 ;8位二進制數循環左移1位
ROL DX,CL ;16位二進制數循環左移CL位
操作說明:ROR指令將目的操作數順序向右移1位或右移CL寄存器中指定的位數。右移1位時,操作數的最低位LSB移入進位標誌CF的同時,還移到最高位MSB形成循環,進位標誌位不在循環環內。
(2)循環右移指令
指令格式: ROR DST,COUNT
操作說明:ROR指令將目的操作數順序向右移1位或移CL寄存器中指定的位數。右移1位時,操作數的最低位LSB移入進位標誌CF的同時,還移到最高位MSB形成循環,進位標誌位不在循環環內。
【例2.44】ROR CX,1
ROR DX,CL
(3)帶進位循環左移指令
指令格式:RCL DST,COUNT
操作說明:RCL指令將目的操作數連同進位標誌CF一起向左循環移動1位或CL寄存器中指定的位數。移動一位時,最高位MSB移入CF,而原CF移入最低位LSB。
【例2.45】ROR CX,1
ROR DX,CL
(4)帶進位循環右移
指令格式: RCR DST,COUNT
操作說明:RCR指令將目的操作數連同進位標誌CF一起向右循環移動1位或由CL寄存器中指定的位數。移動一位時,最低位LSB移入CF,而原CF則移入最高位MSB。
【例2.46】 測試AL寄存器中第5位的狀態,爲“0”時轉向ZERO,否則向下繼續執行。
方法1 用循環移位指令實現:
MOV CL,6
ROR AL,CL ;將AL的bit5移入CF
JNC ZERO ;若CF=0,則轉向ZERO處
┇ ;否則,繼續執行
ZERO: ……
方法2:用測試指令實現:
TEST AL,20H ;將AL與20H相“與”
JZ ZERO ;若結果爲0,則轉向ZERO處
┇ ;否則,繼續執行
ZERO: ……