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

标签 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。我不确定问题出在内联技术还是程序集本身。

最佳答案

这里有两个问题:

首先:您对输出操作数 a 使用的 "=r" 约束向编译器表明该操作数是只写的——允许假设不需要初始值。您的代码绝对不是这种情况!将限定符更改为 "+r",让编译器知道初始值很重要。

其次:您正在将结果移动到错误的寄存器!最后一个movl的目标%1b对应的寄存器,不是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/

相关文章:

c - 如何使用循环访问矩阵的元素

c - 如何使用 pthread_exit() 重用线程

assembly - 调用函数时如何在MIPS中保留堆栈中的全局变量?

c - 如何在 Windows 上找到系统调用?

c - unsigned int 和 signed char 比较

c - 文件全局定义

php - 将 C 转换为 PHP?

c - 如何将 C 中带有数组的 while 循环转换为 ARM

linux - 我有一个问题。汇编和 gdb 新手

Windows Loader 对 DLL 的操作