1. 程式人生 > >組合語言--微機CPU的指令系統(五)(移位操作指令)

組合語言--微機CPU的指令系統(五)(移位操作指令)

(5) 移位操作指令

移位操作指令是一組經常使用的指令,它包括算術移位、邏輯移位、雙精度移位、迴圈移位和帶進位的迴圈移位等五大類。

移位指令都有指定移動二進位制位數的運算元,該運算元可以是立即數或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,左移n位可以實現乘以2^n的功能;

算術右移SAR把目的運算元的高位向低位移,空出的高位用最高位(符號位)填補,右移n位可以實現乘以2^(-n)的功能。

clip_image002

例5.10 已知(AH)=12H,(BL)=0A9H,試給出分別用算術左移和右移指令移動1位後,暫存器AH和BL的內容。

解:用算術左移和右移指令移動1位後,暫存器AH和BL的結果如下表所示。

clip_image004

2、邏輯移位指令

此組指令有:邏輯左移SHL(Shift Logical Left)和邏輯右移SHR(Shift Logical Right)。它們的指令格式如下:

SHL/SHR Reg/Mem, CL/Imm

受影響的標誌位:CF、OF、PF、SF和ZF(AF無定義)。

邏輯左移/右移指令只有它們的移位方向不同,移位後空出的位都補0。它們的具體功能下圖(a)、(b)所示。

clip_image006

例5.11 已知(AH)=12H,(BL)=0A9H,試給出分別用邏輯左移和右移指令移動1位後,暫存器AH和BL的內容。

解:用算術左移和右移指令移動1位後,暫存器AH和BL的結果如下表所示。

clip_image008

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無定義)

clip_image010

下面是幾個雙精度移位的例子及其執行結果。

clip_image012

4、迴圈移位指令

迴圈移位指令有:迴圈左移ROL(Rotate Left)和迴圈右移ROR(Rotate Right)。

指令的格式:ROL/ROR Reg/Mem, CL/Imm

受影響的標誌位:CF和OF

迴圈左移/右移指令只是移位方向不同,它們移出的位不僅要進入CF,而且還要填補空出的位。具體功能如下圖(a)、(b)所示。

clip_image014

下面是幾個迴圈移位的例子及其執行結果。

clip_image016

5、帶進位的迴圈移位指令

帶進位的迴圈移位指令有:帶進位的迴圈左移RCL(Rotate Left Through Carry)和帶進位的迴圈右移RCR(Rotate Right)。

指令的格式:RCL/RCR Reg/Mem, CL/Imm

受影響的標誌位:CF和OF

帶進位的迴圈左移/右移指令只有移位的方向不同,它們都用原CF的值填補空出的位,移出的位再進入CF。具體功能如下圖(a)、(b)所示。

clip_image018

下面是幾個帶進位迴圈移位的例子及其執行結果。

clip_image020

例5.12 編寫指令序列把由DX和AX組成的32位二進位制算術左移、迴圈左移1位。

解:

clip_image022

總結:

邏輯左移時,最高位丟失,最低位補0;

邏輯右移時,最高位補0,最低位丟失;

算術左移時,依次左移一位,尾部補0,最高的符號位保持不變。

算術右移時,依次右移一位,尾部丟失,符號位右移後,原位置上覆制一個符號位;

迴圈左移時,將最高位重新放置最低位

迴圈右移時,將最低位重新放置最高位

使用迴圈操作的一個目的就是把每一位連續放到最左邊,以判定資料的符號。如果要把一個數字的高位部分和低位部分互換,採用一位操作就很方便,速度很快。

例如:

1010100010101  

邏輯左移一位結果為 0101000101010

邏輯右移一位結果為 0101010001010

算術左移一位結果為 1101000101010

算術右移一位結果為 1101010001010

迴圈左移一位結果為 0101000101011

迴圈右移一位結果為 1101010001010

迴圈左移ROL和帶位迴圈左移RCL的區別:

假設當前,AL=01010011B,CF=1,則

執行指令 ROL AL,1

後,AL=10100110B,CF=0

執行指令 RCL AL,1

後,AL=10100111B,CF=0

最後一位的1,是先前CF的1