2011-08-25 13 views
48

私はいくつかのasmコードで遊んでいます。何かが気になります。GCCで生成されたasmをコンパイルするにはどうすればよいですか?

私はこのコンパイル:私の次の問題はどのように私はこの出力をコンパイルし、私ができるか、本当に

.cstring 
LC0: 
    .ascii "Hello World\0" 
    .text 
.globl _main 
_main: 
LFB3: 
    pushq %rbp 
LCFI0: 
    movq %rsp, %rbp 
LCFI1: 
    subq $16, %rsp 
LCFI2: 
    movl %edi, -4(%rbp) 
    movq %rsi, -16(%rbp) 
    leaq LC0(%rip), %rdi 
    call _puts 
    movl $0, %eax 
    leave 
    ret 
LFE3: 
    .section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support 
EH_frame1: 
    .set L$set$0,LECIE1-LSCIE1 
    .long L$set$0 
LSCIE1: 
    .long 0x0 
    .byte 0x1 
    .ascii "zR\0" 
    .byte 0x1 
    .byte 0x78 
    .byte 0x10 
    .byte 0x1 
    .byte 0x10 
    .byte 0xc 
    .byte 0x7 
    .byte 0x8 
    .byte 0x90 
    .byte 0x1 
    .align 3 
LECIE1: 
.globl _main.eh 
_main.eh: 
LSFDE1: 
    .set L$set$1,LEFDE1-LASFDE1 
    .long L$set$1 
LASFDE1: 
    .long LASFDE1-EH_frame1 
    .quad LFB3-. 
    .set L$set$2,LFE3-LFB3 
    .quad L$set$2 
    .byte 0x0 
    .byte 0x4 
    .set L$set$3,LCFI0-LFB3 
    .long L$set$3 
    .byte 0xe 
    .byte 0x10 
    .byte 0x86 
    .byte 0x2 
    .byte 0x4 
    .set L$set$4,LCFI1-LCFI0 
    .long L$set$4 
    .byte 0xd 
    .byte 0x6 
    .align 3 
LEFDE1: 
    .subsections_via_symbols 

:これはアセンブラコードの素敵な小さな作品を生成gcc file.c -S -o file.S

#include <stdio.h> 

int main(int argc, char** argv){ 
    printf("Hello World\n"); 
    return 0; 
} 

をGCCは私のためにそれをする?

答えて

61

はい、gccを使用してasmコードをコンパイルできます。

gcc -c file.S -o file.o 

これは、オブジェクトコードファイルfile.oを提供します。

gcc file.o -o file 
+9

あなたは 'gcc file.S -o file' –

+0

を" as -o hello.o hello.s "としてどうやって使うことができますか? https://www3.ntu.edu.sg/home/ehchua/programming/cpp/gcc_make.htmlで示されるように。プロセスの順番がプリプロセス(* .i-ファイル)、コンパイル(* .s-ファイル)、アセンブル(* .o-ファイル)、リンク(* .exe-ファイル)のようです。 – user1677716

3

はい、gccはアセンブリソースコードをコンパイルすることもできます。あるいは、アセンブラであるasを呼び出すこともできます。 (GCCは... Cコンパイラ、C++コンパイラ、アセンブラ、リンカを呼び出すために、ヒューリスティックを使用して、単に「ドライバ」プログラム、などである)

+1

GCC のいくつかのbinutilsを学ぶのを助けるでしょうか? –

+0

また、私はIntels iccをarroundに置いていますが、どのアセンブラを使用していますか? –

+4

@Martin、 'gcc -v'にアクションの記述をお願いします。 –

7

あなたは、通常のCプログラムでアセンブリコードを埋め込むことができます。上記のコマンドの後に、次の実行リンカーを起動するには 。ここには良いintroductionがあります。 EAXがfoo

  • EBXは中値バー
  • ものでなければならないものでなければならない

    • :適切な構文を使用して、あなたはまた、あなたは以下のプログラムがあることはgccに指示C.で宣言された変数と対話したいGCCを伝えることができますアセンブリコードが

    \ n

    int main(void) 
    { 
         int foo = 10, bar = 15; 
         __asm__ __volatile__("addl %%ebx,%%eax" 
              :"=a"(foo) 
              :"a"(foo), "b"(bar) 
              ); 
         printf("foo+bar=%d\n", foo); 
         return 0; 
    } 
    
  • 37

    を実行した後、EAXは、FOOに格納されなければなりませんは、アセンブリファイルを入力として使用し、必要に応じてアセンブラを呼び出すことができます。微妙とはいえ、あります:

    • ファイル名は「.s」(小文字の「S」)で終わる場合、gccは、アセンブラを呼び出します。
    • ファイル名は「.S」(大文字の「S」)で終わる場合、gccは、ソースファイルにCプリプロセッサを適用するには(すなわち、それは、そのような#ifなどのディレクティブを認識し、マクロを置き換え)、およびその後が上のアセンブラ呼び出し、結果。

    ので、一般的に、あなたはこのようなものをやりたい:

    gcc -S file.c -o file.s 
    gcc -c file.s 
    
    +0

    これは動作しているようですが、エラーメッセージが表示されます: 'Malformed Mach-o file' –

    +0

    '.S'接頭辞(大文字)を使用する必要があります。そうでなければgccは別のファイルタイプを検出します) –

    0
    nasm -f bin -o 2_hello 2_hello.asm 
    
    +2

    これはかなり短い答えです。説明を追加してください。たぶんあなたは、パラメータが何をしているのか、そして他の答えと比べてあなたが何をしているのかを教えてくれるでしょう。 – GameDroids

    2

    あなたがmain.sファイルを持っている場合。 あなたはGCCによってオブジェクトファイルを生成することができ、またas

    # gcc -c main.s 
    # as main.s -o main.o 
    

    チェックこのリンクは、それはあなたが、私はGCCは次のように使用していた方法を見つけ出すにはどうすればよいhttp://www.thegeekstuff.com/2017/01/gnu-binutils-commands/

    関連する問題