導入
高級言語の if が、cmp + 条件ジャンプにどう対応するかを見ます。
説明
C のコード:
if (x > 0) {
result = 1;
} else {
result = -1;
}
対応するアセンブリ(x を eax、result を ebx とする):
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 <= 0でjle)。 - 分岐の合流点に
end_if:ラベルを置き、if側の最後でjmp end_ifして else を飛び越えます。
やってみよう(考えてみよう)
if (x == 5) だけの分岐(else なし)は、どのジャンプ命令を使えばよい? ―― 「5 でなければスキップ」なので cmp eax, 5 のあと jne(等しくなければ飛ぶ)で本体を飛び越します。