8086指令系統(tǒng)---邏輯指令
AND 邏輯與 SAL 算術左移
OR 邏輯或 SHR 邏輯右移
OT 邏輯非 SAR 算術右移
XOR 異或 ROL 循環(huán)左移
TEST 測試 ROR 循環(huán)右移
RCL 帶進位循環(huán)左移
RCR 帶進位循環(huán)右移
AND dst,src ;邏輯與(logic and)
執(zhí)行操作: (dst)←(dst)(src)
OR dst,src ;邏輯或(logic or)
執(zhí)行操作: (dst)←(dst)(src)
NOT opr ;邏輯非(logic not)
執(zhí)行操作: (opr)←
XOR dst,src ;異或 (exclusive or)
執(zhí)行操作: (dst)←(dst)(src)
TEST opr1,opr2 ;測試(test)
執(zhí)行操作: (opr1)(opr2),根據(jù)與運算結果設置條件碼,結果不回送
邏輯運算指令是一組位操作指令,它們可以對字或字節(jié)按位執(zhí)行邏輯操作,因此,源操作數(shù)經(jīng)常是一個位串。以上五條指令除NOT不影響標志位外,其它四條指令執(zhí)行后,CF和OF置0,AF無定義,SF、ZF和PF根據(jù)運算結果設置。
MOV AL,35H ; (AL)=00110101B
AND AL,0FH ; (AL)=35H0FH=00000101B
; flag settings will be: SF=0,ZF=0,PF=1,CF=OF=0
(2) 可使某些位置1的OR運算
MOV AX,0504H ; (AX)=0000 010100000100B
OR AX,80F0H ; (AL)=0504H80F0H=1000 0101 1111 0100B,
; flags will be: SF=1,ZF=0,PF=0,CF=OF=0
注意:標志位PF按結果的低8 位來設置。
(3) XOR運算使兩個操作數(shù)不同值的位置1,相同值的位置0
A.使某些位求反,其余位不變
MOV BL,86H ; (BL)=1000 0110B
XOR BL,03H ; (BL)=86H03H=1000 0101B,
; flags will be: SF=1,ZF=0,PF=0,CF=OF=0
B.使某寄存器清0
XOR AX,AX ; (AX)=0, clear AX by XORing it with itself
(4) 測試某些位為0或為1
A.測試某數(shù)的奇偶性
MOV DL,0AEH ; (DL)=1010 1110B
TEST DL,01H ; 0AEH01H=0000 0000, ZF=1,but DL is unchanged
JZ EVEN ; if ZF=1,then tested number is even, if ZF=0, odd
B.測試某數(shù)為正數(shù)或負數(shù)
MOV DH,9EH ; (DL)=1001 1110B
TEST DH,80H ; 9EH80H=1000 0000, ZF=0
JZ EVEN ; if ZF=0,then the value is negative, if ZF=1,it is
移位指令包括邏輯移位指令、算術移位指令、循環(huán)移位指令和帶進位循環(huán)移位指令。指令中的目的操作數(shù)dst可以是除立即數(shù)外的任何尋址方式。移位次數(shù)(或位數(shù))cnt=1時,1可直接寫在指令中;cnt>1時,cnt必須放入CL寄存器。
SHLdst,cnt ; 邏輯左移(shift logical left)
SHRdst,cnt ; 邏輯右移(shift logical right)
SALdst,cnt ; 算術左移(shift arithmetic left)
SARdst,cnt ; 算術右移(shift arithmetic right)
SHL和SAL指令向左移動的操作是相同的,在每次逐位移動后,最低位用0來補充,最高位移入CF。SHR與SHL移動的方向相反,每次向右移動后,最高位用0來補充,最低位移入CF。SAR在每次右移都用符號位的值補充最高位,最低位仍然是移入CF。
由此可以看出,算術移位適于帶符號數(shù)的移位處理。我們知道,一個數(shù)左移n位相當于乘以2n,右移n位相當于除以2n, 所以,當一個帶符號數(shù)需要乘(或除)2n時,可使用算術移位指令SAL(或SAR)。當一個無符號數(shù)需要乘(或除)2n時,可使用邏輯移位指令SHL(或SHR)。使用移位指令將一個數(shù)擴大或縮小2n倍,比使用乘法或除法指令的速度快。
移位指令的條件碼設置:
CF= 移入的數(shù)值
OF=1 當cnt=1時,移動后最高位的值發(fā)生變化
OF=0 當cnt=1時,移動后最高位的值未發(fā)生變化
SF、ZF、PF根據(jù)移動后的結果設置
ROL dst,cnt ; 循環(huán)左移(rotate left)
ROR dst,cnt ; 循環(huán)右移(rotate right)
RCL dst,cnt ; 帶進位循環(huán)左移(rotate left through carry)
RCR dst,cnt ; 帶進位循環(huán)右移(rotate right through carry)
這組指令完成位循環(huán)移位的操作,ROL和ROR是簡單的位循環(huán)指令,RCL和RCR是連同CF位一起循環(huán)移位的指令。它們左右移動的方法以及移位次數(shù)的設置與移位指令類似。
循環(huán)移位指令執(zhí)行后,CF和OF的設置方法與移位指令相同;SF、ZF和PF標志位不受影響。
DATA1 DB 9AH
TIMES EQU 3
; ⑴ DATA1 is unsigned operand
MOV CL,TIMES ; set number of times to shift
SHR DATA1,CL ; DATA1 will be 13H, CF=0
; ⑵ DATA1 is signed operand
MOV CL,TIMES ; set number of times to shift
SAR DATA1, CL ; DATA1 will be 0F3H, CF=0
DATAW DW 97F4H
COUNT DB ?
… …
XOR AL,AL ; clear AL to keep the number of 1s in BCD
MOV DL,16 ; rotate total of 16 times
MOV BX,DATAW ; move the operand to BX
AGAIN: ROL BX,1 ; rotate it once
JNC NEXT ; check for 1, if CF=0 then jump
ADD AL,1 ; if CF=1 then add one to count
DAA ; adjust the count for BCD
NEXT: DEC DL ; go through this 16 times
JNC AGAIN ; if not finished go back
MOV COUNT,AL ; save the number of 1s in COUNT
評論