![](/img/trans.png)
[英]Assembly How to translate IMUL opcode (with only one oprand) to C code
[英]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.