C言語のソースファイルをコンパイルする際に、gccのオプションを指定すると実行ファイル前のアセンブリ言語のソースコードを生成できるようなので実際に試して見ました。
コンパイルの処理手順
コンパイルの処理手順は前回整理したので省略します。
C言語のソースファイル
今回はC言語で「Hello World」を表示するだけの定番のコードを用意しました。
#include <stdio.h> int main(void) { printf("Hello World\n"); return 0; }
アセンブリ言語のソースファイル
gccコマンドに-Sオプションを指定して、アセンブリ言語のソースを生成します。
$ gcc -S source.c
生成されたアセンブリ言語のソースファイルの中身がこんな感じです。
.file "nop1.c" .def ___main; .scl 2; .type 32; .endef .section .rdata,"dr" LC0: .ascii "Hello World\0" .text .globl _main .def _main; .scl 2; .type 32; .endef _main: LFB10: .cfi_startproc pushl %ebp .cfi_def_cfa_offset 8 .cfi_offset 5, -8 movl %esp, %ebp .cfi_def_cfa_register 5 andl $-16, %esp subl $16, %esp call ___main movl $LC0, (%esp) call _puts movl $0, %eax leave .cfi_restore 5 .cfi_def_cfa 4, 4 ret .cfi_endproc LFE10: .ident "GCC: (GNU) 5.3.0" .def _puts; .scl 2; .type 32; .endef
movl, subl, callなどの基本的なオペコードが確認できました。
.fileや.textなどは、アセンブルする際の情報で疑似命令らしいです。
ほとんど処理のないコードなのでもう少し分かりやすいソースになるかと思いましたが、前知識がないとCのソースコードは連想できませんね。
C言語を使えるようになったら、アセンブリ言語も色々と触ってみようと思います。
参考書籍
この記事を読んだ人はこんな記事も読んでいます。
【C言語】gccでアセンブリ言語のソースコードを生成する