組合語言--微機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)的功能。
例5.10 已知(AH)=12H,(BL)=0A9H,試給出分別用算術左移和右移指令移動1位後,暫存器AH和BL的內容。
解:用算術左移和右移指令移動1位後,暫存器AH和BL的結果如下表所示。
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的結果如下表所示。
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無定義)
下面是幾個雙精度移位的例子及其執行結果。
4、迴圈移位指令
迴圈移位指令有:迴圈左移ROL(Rotate Left)和迴圈右移ROR(Rotate Right)。
指令的格式:ROL/ROR Reg/Mem, CL/Imm
受影響的標誌位:CF和OF
迴圈左移/右移指令只是移位方向不同,它們移出的位不僅要進入CF,而且還要填補空出的位。具體功能如下圖(a)、(b)所示。
下面是幾個迴圈移位的例子及其執行結果。
5、帶進位的迴圈移位指令
帶進位的迴圈移位指令有:帶進位的迴圈左移RCL(Rotate Left Through Carry)和帶進位的迴圈右移RCR(Rotate Right)。
指令的格式:RCL/RCR Reg/Mem, CL/Imm
受影響的標誌位:CF和OF
帶進位的迴圈左移/右移指令只有移位的方向不同,它們都用原CF的值填補空出的位,移出的位再進入CF。具體功能如下圖(a)、(b)所示。
下面是幾個帶進位迴圈移位的例子及其執行結果。
例5.12 編寫指令序列把由DX和AX組成的32位二進位制算術左移、迴圈左移1位。
解:
總結:
邏輯左移時,最高位丟失,最低位補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