1

かなり自明のコード。なぜうまくいかないのですか!

#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マニュアルはインラインアセンブリに関して私を混乱させていました...

Inteli7プロセッサに取り組んでいます

4

1 に答える 1

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;
}

また、x86inc命令はメモリを直接操作できるため、これに減らすことができます。

#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.41C式オペランドを使用したアセンブラ命令

于 2012-10-24T02:18:38.487 に答える