匯編語言--微機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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM