一般移位指令

一般移位指令有三条:算术左移/逻辑左移指令,算术右移指令,逻辑右移指令
SAL OPRD,m ;算术左移指令=逻辑左移指令
SHL OPRD,m ;逻辑左移指令
SAR OPRD,m ;算术右移指令
SHR OPRD,m ;逻辑右移指令

m为移位数,值为1或CL,CL存放移位的位数;OPRD可以是寄存器也可以是存储器操作数。标志PF,SF,ZF反映移位后的结果。OF位也受影响,AF标志未定义

(1)算术/逻辑左移指令

SAL OPRD,m
SHL OPRD,m
将操作数OPRD左移m位,每移动一位,右边补0,移出的最高位进入标志位CF。
image.png

(2)算术右移指令

SAR OPRD,m
该指令将操作数右移m位,每移动一位,左边的符号位保持不变,移出的最低位进入标志位CF。

  1. MOV AL,8 MOV AL,-8 ;AL=F8 -8
  2. SAR AL,1 SAR AL,1 ;AL=FC -4
  3. SAR AL,1 SAR AL,1 ;AL=FE -2

对于有符号数和无符号数而言,算术右移一位,相当于除以2

(3)逻辑右移指令SHR

SHR OPRD,m
将操作数OPRD右移m位,同时每移一位,左边用0补足,移出的最低位进入标志位CF

  1. SHR BL,1
  2. SHR AX,CL

对无符号数而言,逻辑右移一位,相当于除以2。
汇编语言中,经常需要对以位为单位的数据进行合并和分解处理,通常使用逻辑运算指令和移位指令进行。

循环移位指令

有四条循环移位指令:左循环移位指令ROL,右循环移位指令ROR,带进位左循环移位指令RCL,带进位右循环移位指令RCR。
image.png
ROL OPRD,m
ROR OPRD,m
RCL OPRD,m
RCR OPRD,m

m为移位次数,值为1或CL,操作数OPRD为寄存器或存储器操作数。
ROL,每移位一次,操作数左移,最高位移入最低位和CF位
ROR,每移位一次,操作数右移,最低位移入最高位和CF位
RCL,每移位一次,操作数左移,最高位移入CF位,CF位移入最低位
RCR,每移位一次,操作数右移,最低位移入CF位,CF位移入最高位

ROL和ROR指令,循环8次或16次,操作数就能复原;
RCL和RCR指令,循环9次或17次,操作数就能复原;

  1. 例:实现AL的高4位和低4位交换
  2. ROL AL,1
  3. ROL AL,1
  4. ROL AL,1
  5. ROL AL,1 ;循环移位4次等于高地位互换
  1. 例:实现AL的最低位送入BL的最低位,仍保持AL不变
  2. ROR BL,1 ;BL循环右移,最低位移出,进入最高位和CF
  3. ROR AL,1 ;AL循环右移,最低位移出进入最高位和CF
  4. RCL BL,1 ;BL循环左移,CF位移入最低位
  5. ROL AL,1 ;AL循环左移,最高位进入最低位,复原