汇编C将一个操作数转换为C代码

时间:2016-04-03 03:41:44

标签: c assembly

我需要用C编写什么才能让汇编程序用一个操作数显示imul?例如:

imul  %ebp

1 个答案:

答案 0 :(得分:3)

如果要编写C以便编译器使用一个操作数发出imul,那么唯一的方法是将有符号乘法扩展为寄存器长度的两倍。

因为non-widening multiplication in 2's complement is the same for both signed and unsigned types所以编译器几乎总是将imul与多个操作数一起使用,因为它更快,更灵活。

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

在x86_64中,gcc更喜欢使用双操作数imul来产生64位结果,即使输入只有32位开始。 gcc does support an __int128_t,但是。

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

    mov     rax, rdi
    imul    rsi
    ret

来自Godbolt Compiler Explorer

的Asm输出