【发布时间】:2011-10-28 23:40:15
【问题描述】:
我有一个简单的内联汇编函数,它在 MSVC 中运行良好,但由于某种原因拒绝在 Apple GCC 4.2.1 下运行(i386 架构,强制 32位模式)。幸运的是,更复杂的汇编函数可以正常工作,但是我无法理解为什么这个不能工作......不幸的是,我无法调试它 - 从外观上看,XCode 中没有寄存器窗口4.0.2(在 3.2 版本中)。
我很肯定这个问题与英特尔风格的组件无关。
int Convert(double value)
{
_asm
{
fld value
push eax
fistp dword ptr [esp]
pop eax
}
// The returned value is insane
}
【问题讨论】:
-
你为什么要在汇编中这样做?浮动 a = 3.14; int b = *(int *)&a;做同样的事情。此外,您传入一个双精度,但将其转换为 32 位。
-
@dascandy:那行代码是未定义的行为。
-
这很重要。是否使用内联汇编定义的行为?
-
开个大玩笑,达斯坎迪!
-
@dascandy:是的,GCC 和 clang 定义了内联 asm 的行为(只要约束实际上向优化器描述了 asm 模板的作用)。或者对于
asm{}块,由编译器来推断哪些寄存器被踩到以及哪些C++ 对象可以被读取或修改。但无论如何,你是对的,为此使用内联汇编是可怕的,而且效率非常低;使用memcpy将内联。 (不是指针转换技巧;g++ -fstrict-aliasing是启用优化的默认设置。)
标签: c++ xcode gcc inline-assembly