簡體   English   中英

如何從 C 代碼中獲取單操作數 imul

[英]How to get single-operand imul from C code

我必須用 C 寫什么才能讓匯編程序顯示帶有一個操作數的imul 例如:

imul  %ebp

如果您想編寫 C 代碼以便編譯器發出帶有一個操作數的imul ,那么唯一的方法是使用加寬有符號乘法,即將操作數轉換為兩倍於寄存器長度的有符號類型。 因此,在 32 位模式下,以下代碼將產生預期的輸出

long long multiply(int x, int y) {
    return (long long)x * y;
}

因為2 的補碼中的非擴展乘法對於有符號和無符號類型是相同的,編譯器幾乎總是將imul與多個操作數一起使用,因為它更快、更靈活。

在 x86_64 中,編譯器更喜歡使用多操作數imul來生成 64 位結果,即使輸入最初只有 32 位。 因此,您還必須使用如上所示的雙寄存器寬度(128 位)類型。 不過,Clang、ICC 和 GCC 確實通過__int128支持這__int128

下面的片段

__int128_t multiply(long long x, long long y) {
    return  (__int128_t)x * y;
}

將被編譯為

mov     rax, rdi
imul    rsi
ret

如果您使用 MSVC,那么您可以在 64 位模式下使用_umul128

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM