汇编移位有两种方法
第一种逻辑位移:
简单来讲就是空出来的用0填充
SHL 是目的操作数算术左移,最高位移入进位标志位CF
格式 reg,imm8 ;mem,imm8;reg,cl;mem,cl (这个cl寄存器不太懂,大佬指点下)
mov al,11110 000b
SHL al,1
;al==1110 0000b cf=1
SHL al,2
;al==1000 0000b cf=1
;如果多次左移,则标志位为最后一次的MSB(最高位)
;再移动一次
SHL al,1
;al==0000 0000b cf=0
有逻辑左移就有右移 SHR
与SHL相同点:都用0填充 。不同点:最低位移到CF
两个位移实现无符号数2次方的乘除
乘法:
mov al,5
;al==0000 0101b
SHL al,1
;al ==0000 1010b
相当于乘了个2
不考虑进位情况下,左移n次就乘了2的n次方
除法
mov al,24
;al==0001 1000b
shr al,2
;al =0000 0110b=6
相当于除了个2的2次方
第二种算术位移
SAL 和SAR两个指令操作格式与SAL一致
SAL和SHL一样(书上是这么说的),有不同见解可以提出就不说了
SAR与SHL都是LSB复制CF中,不同在于填充是看符号位(为1则填充1,为0则填充0)
mov al,1100 0000b;al=192
SAR al,1;
;最低位0 cf=0 最高位1 填充1
;cf=0 al=1110 0000b;al=224
mov al,0011 0001b;al=49
SAR al,1
;最低位0 cf=0 最高位0 填充0
;al=0001 1000b=24 cf=0
SAR还可有符
mov al,-128;1000 0000b
shl al,3;al=1110 0000b=-16
;实现了有符号除法
;因为正负有符号位决定,填充也填充符号位,所以正负就没变
号数除2次幂