逻辑运算指令 and or xor not test
and dest,src;二进制与运算
;dest=dest & src of=0 cf=0
or dest,src
;dest=dest|src of=0 cf=0
xor dest,src
;dest=dest^src of=0 cf=0,异或,相同为0,不一样为1
not op
;op=~op
test dest,src
;null=dest &src
;test类似于and指令,但结果不影响dest,仅影响标志位
mov al,96h
test al,80h;zf=0,al不变,al做高位为1,与80h与之后不为0
test al,1;因为96h最低为为0,与之后为0,zf=1
移位指令shl,shr,sal,sar,rol,ror,rcl,rcr
shl dest,count;逻辑左移
对8位数左移1位,最高位进入cf,最低位补0
格式:
shl reg,1;
shl reg,cl;cl的值为移位次数
shl mem,1
shl mem,cl
shr dest,count;逻辑右移
最低为进入cf,最高位自动补0
格式同上
sal dest,count;算术左移,与shl完全相同
sar dest,count;算术右移
区别在于最高位和之前保持一直,如果之前为1,右移后补1,可以理解为保持原来的符号
rol dest,count;循环左移
最高位在进入cf的时候也移到最低位
ror dest,count;循环右移
最低为在进入cf的时候也进入最高位
rcl dest,count ;带进位循环左移
最高位进入cf,cf进入最低位
;例子,把32位数3f65c932h逻辑左移2位,结果存放在DX:AX中
mov ax,0c932h
mov dx,3f65h
mov cx,2
again:
shl ax,1;低16位逻辑左移1位,最高位移入cf中
rcl dx,1;高16带进位循环左移1,cf位即原低16位最高位移入高16位的最低为
dec cx
jnz again
rcr dest,count;带进位循环右移
最低位移到进位位cf中,进位位cf则移动到最高位
;例子,把32位数CA85ED7Bh逻辑右移2位,
mov ax,0ed7bh
mov dx,0ca85h
mov cx,2
again:
shr dx,1;高16位逻辑右移1位,,最低位移入cf
rcr ax,1;低16位带进位右移,cf即高16位的最低位进入最高位
dec cx
jnz again