SHRD - 雙精度右移

操作碼

指令

說明

0F AC

SHRD r/m16, r16, imm8

r/m16 右移 imm8 位,同時從左側移入來自 r16 的位

0F AD

SHRD r/m16, r16, CL

r/m16 右移 CL 位,同時從左側移入來自 r16 的位

0F AC

SHRD r/m32, r32, mm8

r/m32 右移 imm8 位,同時從左側移入來自 r32 的位

0F AD

SHRD r/m32, r32, CL

r/m32 右移 CL 位,同時從左側移入來自 r32 的位

說明

按第三個運算元(計數運算元)指定的位數將第一個運算元(目標運算元)右移。第二個運算元(源運算元)提供要從左側移入的位(從目標運算元的最高有效位開始)。目標運算元可以是暫存器或記憶體位置;源運算元是暫存器。計數運算元是一個無符號整數,它可以是立即數位元組或 CL 暫存器的內容。僅使用計數的位 0 到 4,它通過設定掩碼將計數值限制在 0 到 31 之間。如果計數大於運算元大小,則目標運算元中的結果未定義。

如果計數為 1 或更大,則 CF 標誌使用最後從目標運算元移出的位填充。對於 1 位移位,如果發生符號更改,則 OF 標誌設定為 1;否則清除此標誌。如果計數運算元是 0,則這些標誌不受影響。

SHRD 指令對於 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, COUNT - 1]; (* last bit shifted out on exit *)
FOR i 0 TO SIZE - 1 - COUNT
DO
BIT[DEST, i] BIT[DEST, i - COUNT];
OD;
FOR i SIZE - COUNT TO SIZE - 1
DO
BIT[DEST,i] BIT[inBits,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 段限制。

虛 8086 模式異常

#GP(0) - 如果記憶體運算元有效地址超出 CS、DS、ES、FS 或 GS 段限制。

#SS(0) - 如果記憶體運算元有效地址超出 SS 段限制。

#PF(錯誤程式碼) - 如果發生頁錯誤。

#AC(0) - 如果在啟用對齊檢查的情況下進行未對齊的記憶體引用。