我有一个简单的内联汇编函数,它在 MSVC 中运行良好,但由于某种原因拒绝在 Apple GCC 4.2.1 下运行(i386 arch,强制 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
}
最佳答案
Fortunately, much more complex assembly functions work fine[...]
这些也是内联汇编函数吗?因为 GCC 使用 completely different内联汇编程序的语法。不过,您可以使语法看起来更熟悉,请参阅 wikipedia .
1 int Convert(double value)
2 {
3 int result;
4 __asm__ __volatile__ (
5 "fist %0\n\t"
6 : "=m" (result)
7 : "t" (value)
8 );
9 return result;
10 }
我会怎么做。 =m
指定我们想要一个内存操作数来存储结果(我们不想要一个寄存器,因为 fist
不适用于那些)。 t
指定值在堆栈顶部传递,这也确保我们进行适当的清理。
编辑:
假设 gcc 和 xcode 允许使用与 msvc 相同类型的内联汇编程序,另一件要尝试的事情是:
int Convert(double value)
{
int result;
_asm
{
fld value
push eax
fistp dword ptr [esp]
pop eax
mov [result], eax
}
return result;
}
这也应该关闭您可能收到的有关缺少返回值的警告。可能只是因为它允许您通过编写 eax 来从汇编程序 block 返回值比 msvc 更严格。
关于c++ - 为什么简单的内联汇编函数不能在 GCC 中正常工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7094276/