【お知らせ】プログラミング記事の投稿はQiitaに移行しました。

jeとjz

第6回 コンパイラ実装会で出た話題です。

jzをアセンブルして逆アセンブルしたらjeになると指摘されました。なぜ変わるのか?

jeとjzは別名(エイリアス)でまったく同じため、どちらを使っても同じマシン語が出力されます。理由としては、cmp命令による比較は引き算で行われるため、結果がゼロ(z)になればオペランドが等しい(e)ということになるためです。

cmp eax, 2
jz foo

objdumpではjeで逆アセンブルされます。これはjeが本来の命令で、jzが派生という意味なのか?という疑問も出ました。正直、どういう方針でjeを出しているのかはよく分かりません。命令の内部処理的にはゼロフラグ(Z)が立っているかどうかを判定しているため、jzの方が本来の表記に近いと考えるのが自然なように思います。