2017-05-04 100 views
0

我知道imul是带符号的乘法,文档似乎暗示三个操作数的语法是imulq dest, source1, source2。因此该行将读为:将存储在%rbx中的地址的内容与%rax中的值相乘,然后将其存储在内存位置44中,但这肯定不正确?

+3

您在英特尔语法和AT&T语法之间混淆不清。 –

+2

[AT&T语法与英语语法相比,源操作数的顺序是什么?](http://stackoverflow.com/questions/7548509/what-is-the-order-of-source-operands-in- att-syntax-comparison-to-intel-syntax) –

回答

2

您使用的是imul指令,该指令在指令集的参考定义为IMUL r64, r/m64, imm8,并指“imm8正片r/m64内容和存储的三操作数变异导致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语法中的参数全部颠倒过来。当你看看英特尔的文档时,你需要改变他们的说法。 (当然,在这种情况下它并不重要,因为乘法是可交换的。) –