C中的内联汇编无法正常工作

时间:2014-07-16 15:59:46

标签: c assembly

我正在尝试学习如何在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;
}

目的是将ab加载到寄存器%r8%r9中,添加它们,然后将输出放回a。 但是,此程序会打印a=2而不是a=3。我不确定问题是在内联技术中还是在程序集本身中。

1 个答案:

答案 0 :(得分:4)

这里有两个问题:

首先:用于输出操作数"=r"的{​​{1}}约束向编译器指示操作数是只写的 - 允许假定不需要初始值。这绝对不是你的代码的情况!将限定符更改为a,让编译器知道初始值 很重要。

第二:您正在将结果移动到错误的寄存器中!最后"+r"的目标%1是与movl对应的注册,而不是b。你想要a

修正:

%0