一、逻辑移位(不管是左移位还是右移位) 都是空缺处补0
例如: mov ax , 1100_0111_0110_1000B
mov cl , 3
shl ax , cl ; 结果 ax = 0011_1011_0100_0000
mov ax , 1100_0111_0110_1000B
mov cl , 3
shr ax , cl ; 结果 ax = 0001_1000_1110_1101 //若为无符号数,目标操作数数值除以2
二、算术移位要保证符号位的不改变(逻辑左移位补0, 逻辑右移位看符号位)
例如: mov ax , 1100_0111_0110_1000B //c768
mov cl , 3
sal ax , cl ; 结果 ax = 0011_1011_0100_0000 //3b40 目标操作数数值乘以2
mov ax , 1100_0111_0110_1000B
mov cl , 3
sar ax , cl ; 结果 ax = 1111_1000_1110_1101
mov ax , 0100_0111_0110_1000B
mov cl , 3
sar ax , cl ; 结果 ax =0000_1000_1110_1101
总结:
1、算术左移和逻辑左移相同。
若无符号数移位后无进位,有符号数移位后无溢出,那么目标操作数数值乘以2
2、算术右移移入的位用符号位填,若是有符号数,右移一位数值除以2
逻辑右移移入的位用0填,若是无符号数,右移一位数值除以2
4个循环移位指令:
循环移位指令类似移位指令,但要将从一端移出的位返回到另一端形成循环。它分成不带进位循环移位和带进位循环移位,分别具有左移或右移操作
三、循环移位
ROL reg/mem,1/CL ;不带进位循环左移
ROR reg/mem,1/CL ;不带进位循环右移
这两条指令不将进位标志CF纳入循环位中。
四、带进位循环移位
RCL reg/mem,1/CL ;带进位循环左移 ,最高位移入CF
RCR reg/mem,1/CL ;带进位循环右移 ,最低位移入CF
这两条指令将进位标志CF纳入循环位中,与操作数一起构成的9位或17位二进制数一起移位。