彙編語言--微機CPU的指令系統(五)(移位操做指令)

(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)的功能。總結

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

相關文章
相關標籤/搜索