我正在尝试学习如何在C代码中使用内联汇编。 我创建了一个小程序,应该添加两个整数:
int main(){
int a=1;
int b=2;
asm( "movl %0, %%r8d;"
"movl %1, %%r9d;"
"addl %%r8d, %%r9d;"
"movl %%r9d, %1;"
: "=r" (a)
: "r" (b)
:"%r8","%r9" );
printf("a=%d\n",a);
return 0;
}
目的是将a
和b
加载到寄存器%r8
和%r9
中,添加它们,然后将输出放回a
。
但是,此程序会打印a=2
而不是a=3
。我不确定问题是在内联技术中还是在程序集本身中。
答案 0 :(得分:4)
这里有两个问题:
首先:用于输出操作数"=r"
的{{1}}约束向编译器指示操作数是只写的 - 允许假定不需要初始值。这绝对不是你的代码的情况!将限定符更改为a
,让编译器知道初始值 很重要。
第二:您正在将结果移动到错误的寄存器中!最后"+r"
的目标%1
是与movl
对应的注册,而不是b
。你想要a
。
修正:
%0