指示を読んでいます
imul 0xffffffd4(%ebp, %ebx, 4), %eax
そして私はそれが正確に何をしているのか困惑しています。imulが乗算されることは理解していますが、構文がわかりません。
指示を読んでいます
imul 0xffffffd4(%ebp, %ebx, 4), %eax
そして私はそれが正確に何をしているのか困惑しています。imulが乗算されることは理解していますが、構文がわかりません。
(私はIntel / MASM構文を知っていて、それを好むので、それを使用します。オペランドの順序はAT&Tとは異なることに注意してください。)
命令は実際には2つのオペランドimul
であり、Intelの構文では次のようになります。
imul eax, DWORD PTR [ebp + ebx*4 + 0FFFFFFD4h]
ここeax
で、は宛先オペランドであり、メモリ位置はソースオペランドです。2オペランドimul
は、ソースオペランドとデスティネーションオペランドの符号付き(2の補数)乗算を実行し、結果をデスティネーションに格納します。
この命令は、レジスタに配列内の整数を乗算しています。ほとんどの場合、これはループで発生し、配列はローカル変数です。
3オペランドのimul
命令は次のとおりです。
imul dest, source1, source2
オペランド(source1
メモリ位置またはレジスタ)にsource2
オペランド(8ビットまたは16/32ビット整数)が乗算され、その結果がdest
オペランド(16、32、または64ビットレジスタ)に格納されます。
AT&Tアセンブリのベース/インデックス構文にご期待ください。これは、3オペランドの乗算ではありません。それはあなたが知っていて愛しているのと同じ2オペランドのものです、それは最初のものが少し複雑であるということだけです。その意味は:
%ebp + (4 * %ebx) + 0xffffffd4
または:
%ebp + (4 * %ebx) - 44
少し明確にするために(そして10進数で)。AT&Tのベース/インデックス構文は次のように分類されます。
offset(base, index, multiplier)