我正在尝试学习如何在 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
。我不确定问题出在内联技术还是程序集本身。
最佳答案
这里有两个问题:
首先:您对输出操作数 a
使用的 "=r"
约束向编译器表明该操作数是只写的——允许假设不需要初始值。您的代码绝对不是这种情况!将限定符更改为 "+r"
,让编译器知道初始值很很重要。
其次:您正在将结果移动到错误的寄存器!最后一个movl
的目标%1
是b
对应的寄存器,不是a
。你想要 %0
。
固定:
asm(
"movl %0, %%r8d;"
"movl %1, %%r9d;"
"addl %%r8d, %%r9d;"
"movl %%r9d, %0;"
: "+r" (a)
: "r" (b)
: "%r8", "%r9"
);
关于c - C 中的内联汇编无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24785417/