吐かれたアセンブラを観察する
本日の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楽しすぎるな。