c – 为什么简单的内联汇编功能在GCC中不能正常工作?

c – 为什么简单的内联汇编功能在GCC中不能正常工作?,第1张

概述我有一个简单的内联汇编函数,它在MSVC中工作正常,但由于某种原因拒绝在Apple GCC 4.2.1(i386 arch,强制32位模式)下工作.幸运的是,更复杂的汇编函数工作得很好,但是我无法理解为什么这个函数不能工作…不幸的是,我无法调试它 – 看起来在XCode 4.0.2中没有寄存器窗口(它是3.2版本). 我很肯定这个问题与英特尔风格的装配无关. int Convert(double 我有一个简单的内联汇编函数,它在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指定我们想要一个内存 *** 作数来存储结果(我们不希望寄存器作为拳头不能用于那些). 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而不是msvc来从汇编程序块返回值更严格.

总结

以上是内存溢出为你收集整理的c – 为什么简单的内联汇编功能在GCC中不能正常工作?全部内容,希望文章能够帮你解决c – 为什么简单的内联汇编功能在GCC中不能正常工作?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1032614.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存