2017-05-04 32 views
0

私はimulが符号付き乗算であることを理解しており、ドキュメントは3つのオペランドの構文がimulq dest, source1, source2であることを示唆しているようです。したがって、行は次のようになります。%rbxに格納されているアドレスの内容と%raxの値を掛け合わせて、メモリ位置44に格納しますが、確かに正しくありませんか?

+3

Intelの構文とAT&Tの構文が混同しています。 –

+2

[インテル構文と比較して、AT&T構文のソースオペランドの順序は?](http://stackoverflow.com/questions/7548509/what-is-the-order-of-source-operands-in- att-syntax-compare-to-intel-syntax) –

答えて

2

あなたはIMUL r64, r/m64, imm8として命令セット・リファレンスで定義され、imm8によってr/m64の内容を乗算し、保存する」を意味しているimul命令、の3オペランドのバリアントを使用しています結果はr64となります。また、32ビットの即値をとるこの命令の別の変種もありますが、この場合、どの変種が実際にアセンブラによって発行されるかはわかりません。

アセンブラは、x86アセンブリのAT & T構文を使用しているようです。これはデフォルトでGNUアセンブラで使用されます。命令のオペランドを逆順に指定することは知られている。したがって、imulq $44, (%rbx), %raxは、%rbxに格納されたアドレスのメモリの内容に44を掛けて、結果を%raxに格納します。

0

オペランドの順序は、ドキュメントの記述方法とは異なります。

"レジスタrbxのメモリアドレスに格納されている符号付き整数値を取得し、それに44を掛けて、結果をレジスタraxに格納します。"

それとも単に: imulq multiplier1, multiplier2, destination

+1

実際には 'imulq multiplier2、multiplier1、destination'です。 AT&T構文では、パラメータはすべて逆になります。インテルのドキュメントを見るときは、彼らの言うことを逆にする必要があります。 (もちろん、この特定のケースでは重要ではありません。なぜなら乗算は可換であるからです。) –

関連する問題