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

标签 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
}

最佳答案

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/

相关文章:

c++ - 添加和比较时签署约定

gcc - 执行步骤,矮人

gcc - 我可以让 Make 安排以并行模式打印的错误消息吗?

c++ - 来自 std::set insert() 和 find() 的写-写数据竞争?

c++ - 将文件中的矩阵加载到 vector 中

c++ - Qt 找不到子项目中的文件

ios - Swift:类型 'ViewController' 不符合协议(protocol) 'UIPageViewControllerDataSource'

c++ - 如何从 C++ 生成均匀分布在 0 和 1 之间的随机 double ?

objective-c - Interface Builder 选择了错误的头文件

ios - 如何在 Swift 中将字典解码为以键为值的结构