将内联asm添加到C宏中

时间:2013-06-07 09:18:54

标签: c++ gcc assembly inline-assembly

我正在使用mingw 4.7.2。

有人可以告诉我这个MACRO有什么问题 我想做的只是一个简单的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

提前致谢

2 个答案:

答案 0 :(得分:4)

#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) )
             <-->          <->    <->

答案 1 :(得分:4)

这是一个更灵活的实现:

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

此外,在此上下文中完全没有__volatile__关键字。