166

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

4

3 に答える 3

217

使用する-masm=intel

gcc -S -masm=intel -Og -fverbose-asm test.c

これはGCC、およびclang3.5以降で機能します。 GCCマニュアル

  • -masm=dialect
    選択した方言を使用してasm命令を出力します。サポートされている選択肢は、intelまたはatt(デフォルト)です。ダーウィンはインテルをサポートしていません。

Mac OSXの場合、デフォルトでは、gccコマンドは実際にclangを実行することに注意してください。最新のclangは-masm=intelこれの同義語としてサポートしていますが、これは常にclangで機能します:

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

Clang 14までは、GCCとは異なり、 clangがインラインステートメントを処理する方法は変更されないことに注意してください。asm()

これらは、MattGodboltのCompilerExplorerサイトでデフォルトで使用されるオプションです。https
://godbolt.org/ 関連項目GCC/clangアセンブリ出力から「ノイズ」を削除する方法 見るのが面白いasm出力を取得するための他のオプションとヒントについては。

于 2008-10-14T04:36:30.997 に答える
18

gcc -S -masm=intel test.c

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

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

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

于 2011-04-12T16:50:18.770 に答える
5

私は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.

それで全部です。

于 2012-05-26T18:30:31.857 に答える