IA-32アセンブリで3オペランドIMULの指示は正確に何をしますか?
-
27-09-2019 - |
質問
私は指示を読んでいます
imul 0xffffffd4(%ebp, %ebx, 4), %eax
そして、私はそれが正確にしていることに困惑しています。 Imulは増殖することを理解していますが、構文を理解することはできません。
解決
AT&Tアセンブリベース/インデックス構文のためのHooray!それは3オペランドの増加ではありません。それはあなたが知っている、そして愛するのと同じ2オペランドです、それはまず最初のものが少し複雑であるということです。その意味は:
%ebp + (4 * %ebx) + 0xffffffd4
または:
%ebp + (4 * %ebx) - 44
少し明確にする(およびベース10で)。 AT&Tベース/インデックス構文は次のように分解します。
offset(base, index, multiplier)
他のヒント
(私は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ビットレジスタ)。
所属していません StackOverflow