int max(int a,int b) { if(a<b)return b; else return a; } int main(void) { int a=10; int b=20; int c; c=max(a+12,b); return c; }
実行可能ファイルに変換後、逆アセンブルして関係する部分のみを取り出すと以下のような機械語に変換されていた
作られる機械語は処理系依存なので以下は一例です。
max関数の先頭 アドレス: 機械語(16進数) アセンブラコード / .........メモ......... 00401000: 55 push ebp /EBPレジスタの値をスタックに積む 00401001: 8B EC mov ebp,esp /EBPに現在のスタックポインタの値をコピー 00401003: 8B 45 08 mov eax,dword ptr [ebp+8] /...a,bの比較準備 00401006: 3B 45 0C cmp eax,dword ptr [ebp+0Ch]/...比較の実行 00401009: 7D 07 jge 00401012 /0以上なら00401012へ飛ぶ 0040100B: 8B 45 0C mov eax,dword ptr [ebp+0Ch]/bの値を戻り値としてEAXにコピー 0040100E: EB 05 jmp 00401015 /00401015へ飛ぶ 00401010: EB 03 jmp 00401015 /00401015へ飛ぶ(この2バイト不要?) 00401012: 8B 45 08 mov eax,dword ptr [ebp+8] /aの値を戻り値としてEAXにコピー 00401015: 5D pop ebp /スタックから元のEBPの値を取り出す 00401016: C3 ret /戻る番地00401044をスタックから取り出して戻る main関数の先頭 00401020: 55 push ebp /EBPレジスタの値をスタックに積む 00401021: 8B EC mov ebp,esp /EBPに現在のスタックポインタの値をコピー 00401023: 83 EC 0C sub esp,0Ch /変数abcの12バイト分をスタックポインタから引き算 00401026: C7 45 FC 0A 00 00 00 mov dword ptr [ebp-4],0Ah /a=10; 0040102D: C7 45 F8 14 00 00 00 mov dword ptr [ebp-8],14h /b=20; 00401034: 8B 45 F8 mov eax,dword ptr [ebp-8] /bの値をEAXレジスタにコピー 00401037: 50 push eax /EAXレジスタの値をスタックに積む 00401038: 8B 4D FC mov ecx,dword ptr [ebp-4] /aの値をEAXレジスタにコピー 0040103B: 83 C1 0C add ecx,0Ch /EAXレジスタに12を加算 0040103E: 51 push ecx /EAXレジスタの値をスタックに積む 0040103F: E8 BC FF FF FF call 00401000 /戻る番地をスタックに積んで00401000番地を呼び出す 00401044: 83 C4 08 add esp,8 /仮引数分のメモリを解放 00401047: 89 45 F4 mov dword ptr [ebp-0Ch],eax/戻り値をレジスタからcへコピー 0040104A: 8B 45 F4 mov eax,dword ptr [ebp-0Ch]/cの値を戻り値にコピー 0040104D: 8B E5 mov esp,ebp /EBPの値をスタックポインターへコピー 0040104F: 5D pop ebp /スタックから元のEBPの値を取り出す 00401050: C3 ret /戻る