第6回 コンパイラ実装会で出た話題です。
jzをアセンブルして逆アセンブルしたらjeになると指摘されました。なぜ変わるのか?
jeとjzは別名(エイリアス)でまったく同じため、どちらを使っても同じマシン語が出力されます。理由としては、cmp命令による比較は引き算で行われるため、結果がゼロ(z)になればオペランドが等しい(e)ということになるためです。
cmp eax, 2 jz foo
objdumpではjeで逆アセンブルされます。これはjeが本来の命令で、jzが派生という意味なのか?という疑問も出ました。正直、どういう方針でjeを出しているのかはよく分かりません。命令の内部処理的にはゼロフラグ(Z)が立っているかどうかを判定しているため、jzの方が本来の表記に近いと考えるのが自然なように思います。