逻辑指令包含逻辑运算指令和移位指令。逻辑运算指令可对操作数履行逻辑运算,移位指令履行对操作数左移或右移若干位的功用。
AND 逻辑与 SAL 算术左移
OR 逻辑或 SHR 逻辑右移
OT 逻辑非 SAR 算术右移
XOR 异或 ROL 循环左移
TEST 测验 ROR 循环右移
RCL 带进位循环左移
RCR 带进位循环右移
AND dst,src ;逻辑与(logic and)
履行操作: (dst)←(dst)(src)
OR dst,src ;逻辑或(logic or)
履行操作: (dst)←(dst)(src)
NOT opr ;逻辑非(logic not)
履行操作: (opr)←
XOR dst,src ;异或 (exclusive or)
履行操作: (dst)←(dst)(src)
TEST opr1,opr2 ;测验(test)
履行操作: (opr1)(opr2),依据与运算成果设置条件码,成果不回送
逻辑运算指令是一组位操作指令,它们可以对字或字节按位履行逻辑操作,因而,源操作数经常是一个位串。以上五条指令除NOT不影响标志位外,其它四条指令履行后,CF和OF置0,AF无界说,SF、ZF和PF依据运算成果设置。
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运算使两个操作数不同值的方位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.测验某数的奇偶性
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.测验某数为正数或负数
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
移位指令包含逻辑移位指令、算术移位指令、循环移位指令和带进位循环移位指令。指令中的意图操作数dst可所以除当即数外的任何寻址办法。移位次数(或位数)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。
由此可以看出,算术移位适于带符号数的移位处理。咱们知道,一个数左移n位相当于乘以2n,右移n位相当于除以2n, 所以,当一个带符号数需求乘(或除)2n时,可运用算术移位指令SAL(或SAR)。当一个无符号数需求乘(或除)2n时,可运用逻辑移位指令SHL(或SHR)。运用移位指令将一个数扩展或缩小2n倍,比运用乘法或除法指令的速度快。
移位指令的条件码设置:
CF= 移入的数值
OF=1 当cnt=1时,移动后最高位的值发生变化
OF=0 当cnt=1时,移动后最高位的值未发生变化
SF、ZF、PF依据移动后的成果设置
ROL dst,cnt ; 循环左移(rotate left)
ROR dst,cnt ; 循环右移(rotate right)
RCL dst,cnt ; 带进位循环左移(rotate left through carry)
RCR dst,cnt ; 带进位循环右移(rotate right through carry)
这组指令完结位循环移位的操作,ROL和ROR是简略的位循环指令,RCL和RCR是连同CF位一同循环移位的指令。它们左右移动的办法以及移位次数的设置与移位指令相似。
循环移位指令履行后,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