SHL (Shift Left) 與 SHR (Shift Right) 是組合語言基本位移指令,分別對應乘 2 與除 2 (無符號) 的高效實現。語義與 Delphi shl/shr 運算子完全一致。
SHL 目標, 計數 { 邏輯左移,低位補 0,高位進入 CF }
SHR 目標, 計數 { 邏輯右移,高位補 0,低位進入 CF }
計數可為立即數 (1) 或 CL 寄存器 (變量計數)。
var ByteNum: Byte;
begin
{ SHR 右移:相當於除 2 }
asm
mov al, 10000000b { 128 }
shr al, 1 { 01000000b = 64 }
mov ByteNum, al
end;
ShowMessage(IntToStr(ByteNum)); { 64 }
{ SHL 左移:相當於乘 2 }
asm
mov al, 00000001b { 1 }
shl al, 1 { 00000010b = 2 }
shl al, 1 { 00000100b = 4 }
mov ByteNum, al
end;
ShowMessage(IntToStr(ByteNum)); { 4 }
end;
{ 乘 256 (左移 8 位) }
shl eax, 8
{ 除 256 (右移 8 位) }
shr eax, 8
{ 獲取高位元組 → 低位 }
mov al, ah
{ 或 }
shr eax, 8
mov al, al
| 指令 | 方向 | 補位 | 符號保持 | 用途 |
|---|---|---|---|---|
| SHL | 左 | 0 | 否 | 無符號乘 2^n |
| SHR | 右 | 0 | 否 | 無符號除 2^n |
| SAL | 左 | 0 | 否 | SHL 同義 |
| SAR | 右 | 符號位 | 是 | 有符號除 2^n |
| ROL/ROR | 循環 | 循環 | - | 位循環、加密 |
| RCL/RCR | 帶進位循環 | CF參與 | - | 多精度移位 |