如何从 C 代码中获取单操作数 imul
Posted
技术标签:
【中文标题】如何从 C 代码中获取单操作数 imul【英文标题】:How to get single-operand imul from C code 【发布时间】:2016-04-03 03:41:44 【问题描述】:我必须用 C 写什么才能让汇编器用一个操作数显示imul
?例如:
imul %ebp
【问题讨论】:
没有规定要求编译器编写者使用特定指令。因此,除了在特定版本中使用特定编译器并使用特定选项发布可能会发生什么之外,您的问题没有答案。所以总的来说不是一个有用的问题。 x86 MUL Instruction from VS 2008/2010的可能重复 不同编译器的相同问题,但答案相同。 【参考方案1】:如果您想编写 C 代码以便编译器发出带有一个操作数的 imul
,那么唯一的方法是使用 加宽有符号乘法,即将操作数转换为有符号类型寄存器长度的两倍。因此,在 32 位模式下,以下代码将产生预期的输出
long long multiply(int x, int y)
return (long long)x * y;
因为non-widening multiplication in 2's complement is the same for both signed and unsigned types,编译器几乎总是将imul
与多个操作数一起使用,因为它更快、更灵活。
在 x86_64 编译器更喜欢使用多操作数 imul
来生成 64 位结果,即使输入开始时只有 32 位。因此,您还必须像上面那样使用双寄存器宽度(128 位)类型。不过,Clang、ICC 和 GCC 确实通过 __int128
支持。
下面的sn-p
__int128_t multiply(long long x, long long y)
return (__int128_t)x * y;
将是compiled to
mov rax, rdi
imul rsi
ret
如果您使用 MSVC,那么您可以在 64 位模式下使用 _umul128
【讨论】:
您的演示省略了-m32
,因此gcc 只使用了一个双操作数64 位imul
。此外,在您没有达到字符数限制的帖子中,最好使用非缩短的神螺栓链接to avoid any chance of link-rot
@PeterCordes 谢谢。我一开始放了 -m32 但后来删除它以检查 x86_64 代码并忘记再次包含它以上是关于如何从 C 代码中获取单操作数 imul的主要内容,如果未能解决你的问题,请参考以下文章
禁用优化的 c alloca 函数的奇怪汇编代码 - gcc 使用 DIV 和 IMUL 为常数 16,并转换?