Rya*_*yan 4 c++ xcode gcc inline-assembly
我有一个简单的内联汇编函数,它在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
}
Run Code Online (Sandbox Code Playgroud)
幸运的是,更复杂的装配功能工作正常[...]
这些也是内联汇编功能吗?因为GCC 对内联汇编程序使用完全不同的语法.您可以使语法看起来更熟悉,请参阅维基百科.
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 }
Run Code Online (Sandbox Code Playgroud)
我是怎么做的.=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;
}
Run Code Online (Sandbox Code Playgroud)
这也应该关闭你可能会得到的关于丢失返回值的警告.可能只是因为允许您通过编写eax而不是msvc来从汇编程序块返回值更严格.
| 归档时间: |
|
| 查看次数: |
3777 次 |
| 最近记录: |