【问题标题】:add inline asm into C macro将内联汇编添加到 C 宏中
【发布时间】:2013-06-07 09:18:53
【问题描述】:

我正在使用 mingw 4.7.2。

谁能告诉我这个宏有什么问题 我想做的只是一个简单的 asm 宏,它添加两个 int 并将结果放入 result 变量中

#define add(result,a,b) \
   __asm__ __volatile__( \
"           movl %1, %%eax \n" \
"           addl %2, %%eax \n" \
"           movl %%eax, %0 \n" \
"           :"=r"(result) \
            :"r"(a),"r"(b) )

编译器说error: missing terminating " character

提前致谢

【问题讨论】:

  • 我猜这里 *" :"=r"(result) * 引号数量有问题
  • 你也应该在你的clobber中标记eax(或者使用%1已经在一个寄存器中的事实,所以你实际上不需要将它移动到任何地方来将它添加到另一个寄存器)
  • 感谢Sharptooth,我忘了检查语法,但gcc inline asm真的很痛苦:(
  • 既然被标记为C++,这个宏就什么都错了,hrhrhr。

标签: c++ gcc assembly inline-assembly


【解决方案1】:
#define add(result,a,b) \
__asm__ __volatile__( \
"           movl %1, %%eax \n" \
"           addl %2, %%eax \n" \
"           movl %%eax, %0 \n" \
"           :"=r"(result) \  // <---- This line starts with a " for no reason.
            :"r"(a),"r"(b) )

标记的行以" 开头,然后将所有其他字符串偏移到宏的末尾。摆脱它吧。

即您的最后两行实际上是:

"           :"=r"(result) :"r"(a),"r"(b) )
<----str----->  <----str---> <----> <-----.... No end

当你真正的意思时

            :"=r"(result) :"r"(a),"r"(b) )
             <-->          <->    <->

【讨论】:

  • 这仍然无法通知编译器%eax 已被破坏,也不会阻止%0%1%2%eax 替换。
【解决方案2】:

这是一个更灵活的实现:

__asm__ ("addl %2, %k0" : "=r" (result) : "%0" (a), "g" (b) : "cc")

此外,__volatile__ 关键字在这种情况下完全没有必要。

【讨论】:

  • 啊,我在阅读整个线程之前发表评论;-) 这个比原来的要好得多,更紧凑,给编译器留下了更多的优化可能性。
猜你喜欢
  • 1970-01-01
  • 2017-11-01
  • 2013-07-23
  • 1970-01-01
  • 2012-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-26
相关资源
最近更新 更多