加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-14 18:10:53 所属栏目:百科 来源:网络整理
导读:我有一个简单的内联汇编函数,它在MSVC中工作正常,但由于某种原因拒绝在Apple GCC 4.2.1(i386 arch,强制32位模式)下工作.幸运的是,更复杂的汇编函数工作得很好,但是我无法理解为什么这个函数不能工作…不幸的是,我无法调试它 – 看起来在XCode 4.0.2中没有寄
我有一个简单的内联汇编函数,它在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 %0nt" 
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来从汇编程序块返回值更严格.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读