指令包括:AND,OR,XOR,NOT,TEST,SHL,SHR,SAR,RCL,ROL,ROR
1.逻辑运算AND,OR,XOR,NOT,TEST
将操作数进行按位的运算,逻辑运算指令对操作的要求大多和mov指令相同。
非 运算指令要求操作数不能是立即数
使用格式:
;使用格式
and target,source ;按位与
1 and 1 ==1
1 and 0 ==0
0 and 0 ==0
---------------------------
or target,source ;按位或
1 or 1 ==1
1 or 0 ==1
0 or 0 ==0
----------------------------
XOR target,source ;按位异或(可以理解为不进位运算)
1 xor 1 ==0
1 xor 0 ==1
0 xor 0 ==0
------------------------------
TEST target,source ;将source与target进行按位与操作,根据结果改变标志位,但是不保存结果
------------------------------
NOT target ;按位非,将target中取反后的结果放入target中
1 --> 0
0 --> 1
示例:
and bl,[bx] ;bl<- bl and ds:[bx]
or ax,bx ;ax<- ax or bx
xor ax,bx ; ax<-ax xor bx
test ax,8000H ;ax and 8000H
not ax ;ax<- not ax
test的演示
not演示
注意事项:
1.通常 使用and指令对指定位清0
2.通常使用or指令对指定位置1
3.通常使用not指令将某个数据取反码,再加1就得到补码
4.通常使用xor指令来取反某位
5.通常使用test指令来测试指定位置是0还是1
6.非运算对标志位不影响,其余指令对标志均会产生影响
2.移位运算(非循环移位)
非循环移位SHL,SAL,SHR,SAR
;左移:算术左移和逻辑左移
;使用格式
SAL reg/mem,1
SAL reg/mem,cl ;有符号数,算术左移,如果采用立即数,立即数必须是1,下述同理
SHL reg/mem,1
SHL reg/mem,cl ;无符号数,逻辑左移
;将数据按照指定的位数往左按位移动,如下图
逻辑左移:移动一位后,若CF与最高位不相等则OF=1,否则OF=0
示例
mov al,f8
sal al,1
;结果 CF=1,al=F0
sal直接输入会错误,需要改成shl
原因:调试时不支持sal,但实际使用可以用
;右移:算术右移和逻辑右移
;使用格式
SAR reg/mem,1
SAR reg/mem,cl ;有符号数,算术右移
SHR reg/mem,1
SHR reg/mem,cl ;无符号数,逻辑右移
;将数据按照指定的位数往右按位移动,如下图
逻辑右移:移出去的位给CF,用0补全最高位
算术右移:移出去的位给CF,用第二位(未移动状态下的最高位)补全最高位
如1111 1111
逻辑右移:0111 1111 CF=1
算术右移:1111 1111 CF=1
示例:
mov bl,f8
sar bl,1
;CF=1,结果为:bl = fc
3.移位运算(循环移位)
带进位循环移位:RCL,RCR,ROL,ROR
;带进位的循环移位
;循环左移
rcl reg/mem,1
rcl reg/mem,cl
;循环右移
rcr reg/mem,1
rcr reg/mem,cl
;带进位循环移位,如下图
不带进位循环移位
;不带进位的循环移位
;循环左移
ROL reg/mem,1
ROL reg/mem,cl
;循环右移
ROR reg/mem,1
ROR reg/mrm,cl
;不带进位循环移位,如下图
示例:
mov al,f8
rol al,1
;CF = 1 ,al = f1
带进位循环与不带进位循环的区别
带进位循环可以看成是一个九位数的不带进位循环