Cからアセンブラをgccで作る方法,あとついでにclangでも作ってみる

gcc

ソースを作ります

hoge.c

int main(int argc, char **argv) {
  int a = 1;
  return 0;
}

-Sオプションを付ければ生成できます

$ gcc -S hoge.c

hoge.s

        .file   "hoge.c"
        .text
        .globl  main
        .type   main, @function
main:
.LFB0:
        .cfi_startproc
        pushq   %rbp
        .cfi_def_cfa_offset 16
        .cfi_offset 6, -16
        movq    %rsp, %rbp
        .cfi_def_cfa_register 6
        movl    %edi, -20(%rbp)
        movq    %rsi, -32(%rbp)
        movl    $1, -4(%rbp)
        movl    $0, %eax
        popq    %rbp
        .cfi_def_cfa 7, 8
        ret
        .cfi_endproc
.LFE0:
        .size   main, .-main
        .ident  "GCC: (GNU) 4.8.5 20150623 (Red Hat 4.8.5-28)"
        .section        .note.GNU-stack,"",@progbits

簡単ですね
アセンブラを読むだけなら -O0 をつけて最適化を無効にしておくのも良いかもです

clang

gccが使えればいいかなと思っていたのでclangは完全に食わず嫌い状態です この際なので触れておいた方がいいでしょう,ということでclangでのやり方です

-save-temps を付ければ作れますね

$ clang -save-temps hoge.c

実行ファイルを作るついでに一時ファイルは保存しておいてねって意味なので,*.s以外のファイルも出てきます ちなみに最適化無効はgccと同じ -O0 です

hoge.s

        .file   "hoge.i"
        .text
        .globl  main
        .align  16, 0x90
        .type   main,@function
main:                                   # @main
        .cfi_startproc
# BB#0:
        pushq   %rbp
.Ltmp2:
        .cfi_def_cfa_offset 16
.Ltmp3:
        .cfi_offset %rbp, -16
        movq    %rsp, %rbp
.Ltmp4:
        .cfi_def_cfa_register %rbp
        movl    $0, %eax
        movl    $0, -4(%rbp)
        movl    %edi, -8(%rbp)
        movq    %rsi, -16(%rbp)
        movl    $1, -20(%rbp)
        popq    %rbp
        ret
.Ltmp5:
        .size   main, .Ltmp5-main
        .cfi_endproc


        .ident  "clang version 3.4.2 (tags/RELEASE_34/dot2-final)"
        .section        ".note.GNU-stack","",@progbits