C言語

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でアセンブリ言語のソースコードを生成する
Tagged on:

コメントを残す