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