操作碼 |
指令 |
說明 |
0F A4 |
SHLD r/m16, r16, imm8 |
將 r/m16 左移 imm8 位,同時從右側移入來自 r16 的位 |
0F A5 |
SHLD r/m16, r16, CL |
將 r/m16 左移 CL 位,同時從右側移入來自 r16 的位 |
0F A4 |
SHLD r/m32, r32, imm8 |
將 r/m32 左移 imm8 位,同時從右側移入來自 r32 的位 |
0F A5 |
SHLD r/m32, r32, CL |
將 r/m32 左移 CL 位,同時從右側移入來自 r32 的位 |
按第三個運算元(計數運算元)指定的位數將第一個運算元(目標運算元)左移。第二個運算元(源運算元)提供要從右側移入的位(從目標運算元的位 0 開始)。目標運算元可以是暫存器或記憶體位置;源運算元是暫存器。計數運算元是一個無符號整數,它可以是立即數位元組或 CL 暫存器的內容。僅使用計數的位 0 到 4,它通過設定掩碼將計數值限制在 0 到 31 之間。如果計數大於運算元大小,則目標運算元中的結果未定義。
如果計數為 1 或更大,則 CF 標誌使用最後從目標運算元移出的位填充。對於 1 位移位,如果發生符號更改,則 OF 標誌設定為 1;否則清除此標誌。如果計數運算元是 0,則這些標誌不受影響。
SHLD 指令對於 64 位或更多位的多精度移位非常有用。
COUNT COUNT MOD 32;
SIZE OperandSize
IF COUNT 0
THEN
no operation
ELSE
IF COUNT SIZE
THEN (* Bad parameters *)
DEST is undefined;
CF, OF, SF, ZF, AF, PF are undefined;
ELSE (* Perform the shift *)
CF BIT[DEST, SIZE - COUNT];
(* Last bit shifted out on exit *)
FOR i SIZE - 1 DOWNTO COUNT
DO
Bit(DEST, i) Bit(DEST, i - COUNT);
OD;
FOR i COUNT - 1 DOWNTO 0
DO
BIT[DEST, i] BIT[SRC, i - COUNT + SIZE];
OD;
FI;
FI;
如果計數為 1 或更大,則 CF 標誌使用最後從目標運算元移出的位填充,並根據結果的值設定 SF、ZF 及 PF 標誌。對於 1 位移位,如果發生符號更改,則 OF 標誌設定為 1;否則清除此標誌。對於大於 1 位的移位,OF 標誌未定義。如果發生移位,則 AF 標誌未定義。如果計數運算元是 0,則這些標誌不受影響。如果計數大於運算元大小,則這些標誌未定義。
#GP(0) - 如果目標位於不可寫的段。如果記憶體運算元有效地址超出 CS、DS、ES、FS 或 GS 段限制。如果 DS、ES、FS 或 GS 暫存器包含空的段選擇器。
#SS(0) - 如果記憶體運算元有效地址超出 SS 段限制。
#PF(錯誤程式碼) - 如果發生頁錯誤。
#AC(0) - 如果啟用對齊檢查並在目前特權級別為 3 時進行未對齊的記憶體引用。
#GP - 如果記憶體運算元有效地址超出 CS、DS、ES、FS 或 GS 段限制。
#SS - 如果記憶體運算元有效地址超出 SS 段限制。
#GP(0) - 如果記憶體運算元有效地址超出 CS、DS、ES、FS 或 GS 段限制。
#SS(0) - 如果記憶體運算元有效地址超出 SS 段限制。
#PF(錯誤程式碼) - 如果發生頁錯誤。
#AC(0) - 如果在啟用對齊檢查的情況下進行未對齊的記憶體引用。