吐かれたアセンブラを観察する

本日のRuby入門はお休み。
今日はなんか、Cで書いたコードからアセンブラを想像しにくいこんな世の中なので、ちょっとアセンブラ吐いて遊んでみた。

今回試したCのコードは、これ。

int hoge()
{
    return 1;
}

int main()
{
    int a;
    int  b = 5;
    a = hoge();

    if ( a != 1) {
        b = 4;
    }else{
        b = 0;
    }
    return 0;
}

目的としては、if文が gcc の最適化でどうなるか見てみたいと思う。

まず、これを-O0(最適化なし)で、吐いたアセンブラ

	.text
.globl _hoge
_hoge:
	pushl	%ebp
	movl	%esp, %ebp
	subl	$8, %esp
	movl	$1, %eax
	leave
	ret
.globl _main
_main:
	pushl	%ebp
	movl	%esp, %ebp
	subl	$24, %esp
	movl	$5, -12(%ebp)
	call	_hoge
	movl	%eax, -16(%ebp)
	cmpl	$1, -16(%ebp)
	je	L4
	movl	$4, -12(%ebp)
	jmp	L6
L4:
	movl	$0, -12(%ebp)
L6:
	movl	$0, %eax
	leave
	ret
	.subsections_via_symbols

一生懸命関数hoge()呼んで、比較してというのがわかる。

これを-O3で最適化したアセンブラがこれ

	.text
	.align 4,0x90
.globl _hoge
_hoge:
	pushl	%ebp
	movl	$1, %eax
	movl	%esp, %ebp
	leave
	ret
	.align 4,0x90
.globl _main
_main:
	pushl	%ebp
	xorl	%eax, %eax
	movl	%esp, %ebp
	leave
	ret
	.subsections_via_symbols

値が確定できる定数は削除するのはしっていたけど、関数すらよばなくなるんですね。当然、if 文は通るパスのみ。
使われていないhoge関数は、残っているけどこれは、staticに宣言しなかったせいだと思う。たぶん、staticにしたら無くなるんじゃないだろうか。

やってみた。

	.text
	.align 4,0x90
.globl _main
_main:
	pushl	%ebp
	xorl	%eax, %eax
	movl	%esp, %ebp
	leave
	ret
	.subsections_via_symbols

やっぱりきえた。

gcc楽しすぎるな。