Posted at

testとjeの仕組み

More than 1 year has passed since last update.

高級言語のif文に相当するものはassemblyでこのように表現されることがあります。

(gas表記)

        test %rax, %rax

je .L0

これの意味を解説します。


test %rax, %rax

test命令は、2オペランドの論理積を計算し、結果がゼロならゼロフラグ(ZF)を立てます。

この例の場合はオペランドが両方同じものなので、raxが1なら結果は1、raxが0なら結果は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