(5) 移位操做指令3d
移位操做指令是一組常用的指令,它包括算術移位、邏輯移位、雙精度移位、循環移位和帶進位的循環移位等五大類。blog
移位指令都有指定移動二進制位數的操做數,該操做數能夠是當即數或CL的值。在8086中,該當即數只能爲1,但在其後的CPU中,該當即數能夠是1··31以內的數。ip
1、算術移位指令get
算術移位指令有:算術左移SAL(Shift Algebraic Left)和算術右移SAR(Shift Algebraic Right)。它們的指令格式以下:it
SAL/SAR Reg/Mem, CL/Immcli
受影響的標誌位:CF、OF、PF、SF和ZF(AF無定義)。循環
算術移位指令的功能描述以下,具體功能下圖(a)、(b)所示。二進制
算術左移SAL把目的操做數的低位向高位移,空出的低位補0,左移n位能夠實現乘以2^n的功能;im
算術右移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