gpt4 book ai didi

c++ - 为什么简单的内联汇编函数不能在 GCC 中正常工作?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:11:36 25 4
gpt4 key购买 nike

我有一个简单的内联汇编函数,它在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com