本文へスキップ
BecomeCoder

アセンブリ言語コース · 第3章 制御構造 · レッスン7

if文をアセンブリで

導入

高級言語の if が、cmp + 条件ジャンプにどう対応するかを見ます。

説明

C のコード:

if (x > 0) {
    result = 1;
} else {
    result = -1;
}

対応するアセンブリ(xeaxresultebx とする):

    cmp     eax, 0        ; x と 0 を比較
    jle     else_part     ; x <= 0 なら else へジャンプ
    mov     ebx, 1        ; result = 1
    jmp     end_if
else_part:
    mov     ebx, -1       ; result = -1
end_if:
  • 「条件が成り立たないときに else へ飛ぶ」という、逆向きの発想がポイントです(x > 0 の反対 x <= 0jle)。
  • 分岐の合流点に end_if: ラベルを置き、if 側の最後で jmp end_if して else を飛び越えます。

やってみよう(考えてみよう)

if (x == 5) だけの分岐(else なし)は、どのジャンプ命令を使えばよい? ―― 「5 でなければスキップ」なので cmp eax, 5 のあと jne(等しくなければ飛ぶ)で本体を飛び越します。