C言語のサンプルプログラム

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                           /戻る