web-dev-qa-db-ja.com

gccを使用してIntel構文のアセンブリコードを生成するにはどうすればよいですか?

gcc -SオプションはAT&T構文でアセンブリコードを生成しますが、Intel構文でファイルを生成する方法はありますか?または、2つの間で変換する方法はありますか?

141
hyperlogic

これを試しましたか?

gcc -S -masm=intel test.c

テストされていませんが、私はこれを見つけました フォーラム 誰かがそれが彼らのために働いたと主張したところです。

私はMacでこれを試しただけで失敗したので、マニュアルページを見てみました:

   -masm=dialect
       Output asm instructions using selected dialect.  Supported choices
       are intel or att (the default one).  Darwin does not support intel.

プラットフォームで動作する場合があります。

Mac OSXの場合:

clang++ -S -mllvm --x86-asm-syntax=intel test.cpp

ソース: https://stackoverflow.com/a/11957826/950427

184
Jason Dagit

gcc -S -masm=intel test.c

私と一緒に動作します。しかし、これはgccの実行とは関係ありませんが、別の方法で言えます。実行可能ファイルまたはオブジェクトコードファイルをコンパイルしてから、以下のようにobjdumpを使用してIntel asm構文でオブジェクトコードを逆アセンブルします。

 objdump -d --disassembler-options=intel a.out

これが役立つかもしれません。

16
phoxis

私はこのコードをCPPファイルに持っています:

#include <conio.h>
#include <stdio.h>
#include <windows.h>

int a = 0;
int main(int argc, char *argv[]) {
    asm("mov eax, 0xFF");
    asm("mov _a, eax");
    printf("Result of a = %d\n", a);
    getch();
    return 0;
 };

これは、次のGCCコマンドラインで動作するコードです。

gcc.exe File.cpp -masm=intel -mconsole -o File.exe

結果は* .exeファイルになり、私の経験では機能しました。

Notes:
immediate operand must be use _variable in global variabel, not local variable.
example: mov _nLength, eax NOT mov $nLength, eax or mov nLength, eax

A number in hexadecimal format must use at&t syntax, cannot use intel syntax.
example: mov eax, 0xFF -> TRUE, mov eax, 0FFh -> FALSE.

それで全部です。

5
RizonBarns