LoginSignup
6

testとjeの仕組み

Last updated at Posted at 2018-05-20

高級言語の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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
6