C中的内联汇编

时间:2012-10-24 00:51:25

标签: gcc assembly inline-assembly

非常自我解释的代码。为什么不起作用呢?

#include <stdio.h>

int main() {
    __asm__("number dw 0"); // declare number?
    printf("%d",number);
    __asm__("mov %eax,number"
            "inc %eax"
            "mov number,%eax");
    printf("%d",number);
    return 0;
}

cc     ex1.c   -o ex1
ex1.c: In function ‘main’:
ex1.c:22:17: error: ‘number’ undeclared (first use in this function)
ex1.c:22:17: note: each undeclared identifier is reported only once for each function it appears in
make: *** [ex1] Error 1

感谢。

我有很多知识空白要填补...... gcc手册让我对内联汇编感到困惑,谷歌搜索教程的结果......

使用intel i7处理器

1 个答案:

答案 0 :(得分:5)

使用此语法,您可以从内联程序集

访问C中声明的变量
#include <stdio.h>

int main() {
    int number = 0;
    printf("%d\n",number);
    asm(
        "mov %[number],%%eax\n"
        "inc %%eax\n"
        "mov %%eax,%[number]\n"
        : [number] "=m" (number) : "m" (number) : "eax", "cc" );
    printf("%d\n",number);
    return 0;
}

您可以通过在输入上指定number约束,让编译器为您eax加载"a"

#include <stdio.h>

int main() {
    int number = 0;
    printf("%d\n",number);
    asm(
        "inc %%eax\n"
        "mov %%eax,%[number]\n"
        : [number] "=m" (number) : "a" (number) : "cc" );
    printf("%d\n",number);
    return 0;
}

由于x86 inc指令可以直接对内存进行操作,因此可以将其减少到此

#include <stdio.h>

int main() {
    int number = 0;
    printf("%d\n",number);
    asm(
        "incl %[number]\n" /* incl -> "long" (32-bits) */
        : [number] "=m" (number) : "m" (number) : "cc" );
    printf("%d\n",number);
    return 0;
}

有关更多信息,请参阅gcc文档:

6.41 Assembler Instructions with C Expression Operands

相关问题