移位指令

屬於彙編語言邏輯指令

移位操作指令是一組經常使用的指令,屬於彙編語言邏輯指令中的一部分,它包括移位指令(含算術移位指令、邏輯移位指令),循環移位指令(含帶進位的循環移位指令),雙精度移位指令三大類。其功能為將目的操作數的所有位按操作符規定的方式移動1位或按寄存器CL規定的次數(0~255)移動,結果送入目的地址。目的操作數是8位(或16位)的寄存器數據或存儲器數據。

詳述


說明

一般格式 移位操作符(如SHR) OPR,CNT.
其中OPR用除立即數外的任何定址方式。移位次數由CNT決定,在8086中可以是1或CL,CNT為1時只移一位;如果需要移位的次數大於1時,需要先將移位次數存入CL寄存器中,而移位指令中的CNT寫為CL即可。在其他機型中可使用CL和CNT,且CNT的值除可用1外,還可以用8位立即數指定範圍從1到31的移位次數。有關OPR和CNT的規定適用於以下所有指令操作。具體格式如下所述。以邏輯右移為例。
如:MOV AX,62H
SHR AX,1
當移位數大於1時,需要先將移位數放進CL中然後再進行移位操作。
如:MOV AL,62H
MOV CL,4
SHR AL,CL
條件標誌位
CF(進位標誌) = 移入的數值
1 CNT=1時,最高有效位的值發生變化
0 CNT=1時,最高有效位的值不變
移位指令:
SF(符號標誌)、ZF(零標誌)、PF (奇偶標誌)根據移位結果設置,AF(輔助進位標誌)無定義
循環移位指令:
不影響 SF、ZF、PF、AF
條件標誌位應用於具體的操作數中使用,以下敘述中未詳細寫明,初學者可不予理會。

算術指令

SAL(shift arithmetic left) 算術左移
格式:SAL OPR,CNT
含義:算術左移SAL把目的操作數的低位向高位移,空出的低位補0.
(指將要移位的操作數換成二進位表示方法,如62H為01100010B.移位時只是尋常理解中的將這些二進位位逐個向左或向右移,移走的數根據操作符決定捨棄或者放入空出的位置,空出的位置根據操作符決定補0或者放入移走的數)。
SAR(shift arithmetic right) 算術右移
格式:SAR OPR,CNT
算術右移SAR把目的操作數的高位向低位移,空出的高位用最高位(符號位)填補。
如62H二進位表示法為01100010B,最高位為0,無論右移多少位左邊都用0補上。如果最高位是1,則都用1補上。
註:算術移位指令常用於帶符號數*2或/2,受影響的標誌位:CF、OF、PF、SF和ZF(AF無定義)。

邏輯指令

邏輯左移SHL(Shift Logical Left)和邏輯右移SHR(Shift Logical Right)
格式:SHL(或SHR) OPR,CNT
邏輯左移/右移指令只有它們的移位方向不同,移位后空出的位都補0。
註:邏輯移位指令常用於無符號數*2或/2,受影響的標誌位:CF、OF、PF、SF和ZF(AF無定義)。

循環移位指令

循環左移ROL(Rotate Left)和循環右移ROR(Rotate Right)。
格式:ROL(或ROR) OPR,CNT
循環左移/右移指令只是移位方向不同,它們移出的位不僅要進入CF,而且還要填補空出的位。可以理解為蛇咬尾巴型循環。
帶進位的循環左移RCL(Rotate Left Through Carry)和帶進位的循環右移RCR(Rotate Right)。
格式:RCL(或RCR) OPR, CNT
帶進位的循環左移/右移指令只有移位的方向不同,它們都用原CF的值填補空出的位,移出的位再進入CF。
註:受影響的標誌位:CF和OF。
以上算術,循環和邏輯移位指令均可以作字或位元組的操作,386及其後繼機型還可作雙字操作。

雙精度移位指令

386及其後繼機型可使用本組指令
SHLD(shift left double) 雙精度左移和SHRD(shift right double) 雙精度右移
格式:SHLD(或SHRD) DST,REG,CNT
這組指令可以取兩個字作移位操作而得到一個字的結果,也可以取兩個雙字作移位操作而得到一個雙字的結果。在移位中,作為源操作數的寄存器提供移位值,以補目的操作數因移位引起的空缺,而指令執行完成後,只取目的操作數作為移位的結果,源操作數寄存器則保持指令執行前的值不變。
這是一組三操作數指令,其中DST可以用除立即數以外的任一種定址方式指定字或雙字操作數。源操作數則只能使用寄存器方式指定與目的操作數想同長度的字或雙字。第三個操作數CNT用來指定移位次數,它可以是一個8位的立即數,也可以是CL,用其內容存放移位計數值。移位計數值的範圍為1到31,對於大於31的數,機器則自動取模32的值來取代。
如:SHLD EBX,ECX,16
指令執行前:(EBX)=12345678H, (ECX)=13572468H,
指令執行后:(EBX)=56781357H,(ECX)=13572468H,CF=0.