移位操作指令
移位操作指令是一组经常使用的指令,它包括算术移位、逻辑移位、双精度移位、循环移位和带进位的循环移位等五大类。
移位指令都有指定移动二进制位数的操作数,该操作数可以是立即数或CL的值。在8086中,该立即数只能为1,但在其后的CPU中,该立即数可以是1··31之内的数。
1、算术移位指令
算术移位指令有:算术左移SAL(Shift Algebraic Left)和算术右移SAR(Shift Algebraic Right)。它们的指令格式如下:
SAL/SAR Reg/Mem, CL/Imm
受影响的标志位:CF、OF、PF、SF和ZF(AF无定义)。
算术移位指令的功能描述如下,具体功能下图(a)、(b)所示。
算术左移SAL把目的操作数的低位向高位移,空出的低位补0;
算术右移SAR把目的操作数的高位向低位移,空出的高位用最高位(符号位)填补。
|
|
|
|
例5.10 已知(AH)=12H,(BL)=0A9H,试给出分别用算术左移和右移指令移动1位后,寄存器AH和BL的内容。
解:用算术左移和右移指令移动1位后,寄存器AH和BL的结果如下表所示。
操作数的初值 |
执行的指令 |
执行后操作数的内容 |
(AH)=12H |
SAL AH, 1 |
(AH)=24H |
(BL)=0A9H |
SAL BL, 1 |
(BL)=52H |
(AH)=12H |
SAR AH, 1 |
(AH)=09H |
(BL)=0A9H |
SAR BL, 1 |
(BL)=0D4H |
下面是学习和理解算术移位指令的控件。它简单、直观地表达了该移位指令的功能,通过它,学习者可准确地掌握计算机系统中该移位指令的含义。
在该控件中,操作者可随机生成第一操作数,也可自行输入之。为了便于比较,在执行指令前,把原操作数的内容存入“操作前的数据”中。
思考题:下面有两组指令序列,问每组指令执行后,寄存器AX的不会变化吗?
SAL AX, 1 SAR AX, 1 |
或 |
SAR AX, 1 SAL AX, 1 |
2、逻辑移位指令
此组指令有:逻辑左移SHL(Shift Logical Left)和逻辑右移SHR(Shift Logical Right)。它们的指令格式如下:
SHL/SHR Reg/Mem, CL/Imm
受影响的标志位:CF、OF、PF、SF和ZF(AF无定义)。
逻辑左移/右移指令只有它们的移位方向不同,移位后空出的位都补0。它们的具体功能下图(a)、(b)所示。
|
|
|
|
例5.11 已知(AH)=12H,(BL)=0A9H,试给出分别用逻辑左移和右移指令移动1位后,寄存器AH和BL的内容。
解:用算术左移和右移指令移动1位后,寄存器AH和BL的结果如下表所示。
操作数的初值 |
执行的指令 |
执行后操作数的内容 |
(AH)=12H |
SHL AH, 1 |
(AH)=24H |
(BL)=0A9H |
SHL BL, 1 |
(BL)=52H |
(AH)=12H |
SHR AH, 1 |
(AH)=09H |
(BL)=0A9H |
SHR BL, 1 |
(BL)=54H |
学习和理解逻辑移位指令的控件。
3、双精度移位指令
此组指令有:双精度左移SHLD(Shift Left Double)和双精度右移SHRD(Shift Right Double)。它们都是具有三个操作数的指令,其指令的格式如下:
SHLD/SHRD Reg/Mem, Reg, CL/Imm ;80386
其中:第一操作数是一个16位/32位的寄存器或存储单元;第二操作数(与前者具有相同位数)一定是寄存器;第三操作数是移动的位数,它可由CL或一个立即数来确定。
在执行SHLD指令时,第一操作数向左移n位,其“空出”的低位由第二操作数的高n位来填补,但第二操作数自己不移动、不改变。
在执行SHRD指令时,第一操作数向右移n位,其“空出”的高位由第二操作数的低n位来填补,但第二操作数自己也不移动、不改变。
SHLD和SHRD指令的移位功能示意图如图5.8所示。
受影响的标志位:CF、OF、PF、SF和ZF(AF无定义)
|
|
|
|
下面是几个双精度移位的例子及其执行结果。
双精度移位指令 |
指令操作数的初值 |
指令执行后的结果 |
SHLD AX, BX, 1 |
(AX)=1234H,(BX)=8765H |
(AX)=2469H |
SHLD AX, BX, 3 |
(AX)=1234H,(BX)=8765H |
(AX)=91A4H |
SHRD AX, BX, 2 |
(AX)=1234H,(BX)=8765H |
(AX)=448DH |
SHRD AX, BX, 4 |
(AX)=1234H,(BX)=8765H |
(AX)=5123H |
学习和理解双精度移位指令的控件。
4、循环移位指令
循环移位指令有:循环左移ROL(Rotate Left)和循环右移ROR(Rotate Right)。
指令的格式:ROL/ROR Reg/Mem, CL/Imm
受影响的标志位:CF和OF
循环左移/右移指令只是移位方向不同,它们移出的位不仅要进入CF,而且还要填补空出的位。具体功能如下图(a)、(b)所示。
下面是几个循环移位的例子及其执行结果。
|
|
|
|
循环移位指令 |
指令操作数的初值 |
指令执行后的结果 |
ROL AX, 1 |
(AX)=6789H |
(AX)=0CF12H |
ROL AX, 3 |
(AX)=6789H |
(AX)=3C4BH |
ROR AX, 2 |
(AX)=6789H |
(AX)=59E2H |
ROR AX, 4 |
(AX)=6789H |
(AX)=9678H |
学习和理解不带进位的循环移位指令的控件。
5、带进位的循环移位指令
带进位的循环移位指令有:带进位的循环左移RCL(Rotate Left Through Carry)和带进位的循环右移RCR(Rotate Right)。
指令的格式:RCL/RCR Reg/Mem, CL/Imm
受影响的标志位:CF和OF
带进位的循环左移/右移指令只有移位的方向不同,它们都用原CF的值填补空出的位,移出的位再进入CF。具体功能如下图(a)、(b)所示。
下面是几个带进位循环移位的例子及其执行结果。
|
|
|
|
双精度移动指令 |
指令操作数的初值 |
指令执行后的结果 |
RCL AX, 1 |
CF=0,(AX)=0ABCDH |
(AX)=579AH |
RCL AX, 1 |
CF=1,(AX)=0ABCDH |
(AX)=579BH |
RCR AX, 2 |
CF=0,(AX)=0ABCDH |
(AX)=AAF3H |
RCR AX, 2 |
CF=1,(AX)=0ABCDH |
(AX)=EAF3H |
例5.12 编写指令序列把由DX和AX组成的32位二进制算术左移、循环左移1位。
解:
学习和理解带进位的循环移位指令的控件。