3

別のレジスタで指定された左にレジスタ ビットを n 回シフトしようとしています。たとえば、このようなもの

shl    eax, ebx

唯一の問題は、第 2 オペランドをレジスタにすることはできず、即値でなければならないことです。アセンブル時に不明な値でレジスタをシフトするにはどうすればよいですか?

4

1 に答える 1

15

x86 では、 register でシフト カウントを指定できますcl。有効shl eax, clです。

mov   ecx, ebx
shl   eax, cl

clレジスタのみを使用できeax、他のレジスタは使用できないことに注意してください。

また、31 より大きいシフト カウントは 32 を法として実行さshl ax, 20 & 63ます。shl rax, 32cl) で 32 が可能です. についてはIntel のマニュアル エントリをshl参照してください)。


BMI2 命令セット拡張機能は、任意のレジスタのカウントでシフトをサポートし、EFLAGS を更新しないため、変数カウントに対してより効率的です。

; if BMI2 is supported
shlx   edx, eax, ebx     ; edx = eax << (ebx&31)

一部の Haswell+ CPU と Excavator / Ryzen CPU でのみ使用できるため、完全に移植可能なコードでは使用できません。

于 2012-11-16T22:31:25.277 に答える