2017-05-04 97 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語法中的參數全部顛倒過來。當你看看英特爾的文檔時,你需要改變他們的說法。 (當然,在這種情況下它並不重要,因爲乘法是可交換的。) –