命令 | 意味 |
---|---|
jz |
jump if zero |
jne |
jump if not zero |
below/above系のジャンプ命令 符号なしで比較した結果とみなす. |
|
jb |
jump if below |
ja |
jump if above |
jbe |
jump if below or equal |
jae |
jump if above or equal |
less/greater系のジャンプ命令 符号付きの演算結果とみなして,ジャンプするかどうかを決める. |
|
jl |
jump if less |
jg |
jump if greater |
jle |
jump if less or equal |
jge |
jump if greater or equal |
8086のインストラクションポインタに対しては,mov命令で値をセットすることはできない. ジャンプ,コール,リターンおよび割り込み命令の4種類の操作でしか値を変えることができないようになっている.
8086では,アセンブリ言語ソースでjmp 1234
のように絶対アドレスを指定していても,
このjmp命令の次の命令からの指定されたアドレスまでのオフセット(つまり相対アドレス)に変換されるようになっている.
8086のジャンプ命令はすべて,指定されたアドレスを相対アドレスと解釈するようになっている.
CXレジスタをデクリメントし,結果が0でなければ指定されたアドレスにジャンプする.
相対アドレスで1バイトであらわせる範囲内のジャンプをショートジャンプ, 2バイトで表す範囲内へのジャンプをニアジャンプという. 条件ジャンプ(LOOPを含む)はすべてショートジャンプになっている. ヒューリスティックな考え方ではあるけど, 条件ジャンプというのは,たいていの場合if文のような文脈で生成されるものなので, ジャンプ先はごく近く(ショートジャンプであらわせる範囲)に限られているだろうというのは たぶん正しい. ジャンプ先がショートジャンプでは届かない位置にあるときは, ショートジャンプ範囲内のどこかに無条件ジャンプ命令をおいて,そこを中継して目的地に到着するようにする.
無条件ジャンプ命令(jmp命令)はニアジャンプになるが,
飛び先がショートジャンプの範囲内にあるときは,
jmp short label
とすることでショートジャンプに変更することもできる.
実行速度には影響はない(ショートジャンプにしても速くなるわけではない)が,
オブジェクトファイルのサイズが微妙に小さくなる.