5

gcc コマンドで正常にコンパイルされる次のコードがありますgcc ./example.c。プログラム自体は、単純に 2 つの整数を加算する関数「add_two」を呼び出します。拡張アセンブリ命令内で intel 構文を使用するには、最初に intel に切り替えてから AT&T に戻す必要があります。gcc のドキュメントによると、を使用して intel 構文に完全に切り替えることができますgcc -masm=intel ./exmaple

スイッチ-masm=intelでコンパイルしようとすると、コンパイルされず、理由がわかりませんか? すでに命令を削除しようとしました.intel_syntaxが、まだコンパイルされません。

#include <stdio.h>

int add_two(int, int);

int main(){
     int src = 3;
     int dst = 5;
     printf("summe = %d \n", add_two(src, dst));
     return 0;
}

int add_two(int src, int dst){

    int sum;

    asm (
        ".intel_syntax;"  //switch to intel syntax
        "mov %0, %1;"
        "add %0, %2;"

        ".att_syntax;"  //switch to at&t syntax
        : "=r" (sum) //output
        : "r" (src), "r" (dst) //input
    );

    return sum;
}

上記のプログラムをコンパイルすることによるエラーメッセージgcc -masm=intel ./example.cは次のとおりです。

tmp/ccEQGI4U.s: Assembler messages:
/tmp/ccEQGI4U.s:55: Error: junk `PTR [rbp-4]' after expression
/tmp/ccEQGI4U.s:55: Error: too many memory references for `mov'
/tmp/ccEQGI4U.s:56: Error: too many memory references for `mov' 
4

2 に答える 2