高級言語のif文に相当するものはassemblyでこのように表現されることがあります。
(gas表記)
test %rax, %rax
je .L0
これの意味を解説します。
test %rax, %rax
test命令は、2つのオペランドの ビットAND演算を行い、結果がゼロならゼロフラグ(ZF)を立てます。
この例の場合はオペランドが両方同じものなので、raxが0の場合のみゼロフラグが立ちます。
je ラベル
je命令は、ゼロフラグ(ZF)をチェックして、フラグが立っていればラベルへジャンプします。
注意点は、jeは test
の意味や%%rax
の内容などは感知していなくて、単にZFの値のみを見ているということです。
jeの"Jump if Equal"の意味は?
もともとは 「CMP命令の両オペランドが等しいならジャンプせよ」ということからついた名前のようです。
(CMP命令の両オペランドが等しければゼロフラグがたつ → ゼロフラグが立っていればjeはジャンプする)
ですが、この名前は非常に紛らわしいので名前の由来はいったん忘れたほうがよさそうです。
とりあえず JEはJZ("Jump if Zero")と同じと覚えておけばよさそう。
参考 https://stackoverflow.com/questions/13064809/the-point-of-test-eax-eax