別のレジスタで指定された左にレジスタ ビットを n 回シフトしようとしています。たとえば、このようなもの
shl eax, ebx
唯一の問題は、第 2 オペランドをレジスタにすることはできず、即値でなければならないことです。アセンブル時に不明な値でレジスタをシフトするにはどうすればよいですか?
別のレジスタで指定された左にレジスタ ビットを n 回シフトしようとしています。たとえば、このようなもの
shl eax, ebx
唯一の問題は、第 2 オペランドをレジスタにすることはできず、即値でなければならないことです。アセンブル時に不明な値でレジスタをシフトするにはどうすればよいですか?
x86 では、 register でシフト カウントを指定できますcl
。有効shl eax, cl
です。
mov ecx, ebx
shl eax, cl
cl
レジスタのみを使用できeax
、他のレジスタは使用できないことに注意してください。
また、31 より大きいシフト カウントは 32 を法として実行さshl ax, 20
れ& 63
ます。shl rax, 32
cl) で 32 が可能です. についてはIntel のマニュアル エントリをshl
参照してください)。
BMI2 命令セット拡張機能は、任意のレジスタのカウントでシフトをサポートし、EFLAGS を更新しないため、変数カウントに対してより効率的です。
; if BMI2 is supported
shlx edx, eax, ebx ; edx = eax << (ebx&31)
一部の Haswell+ CPU と Excavator / Ryzen CPU でのみ使用できるため、完全に移植可能なコードでは使用できません。