FromNandの日記

自分的備忘録

x86のジャンプ命令とコール命令の詳細

先のこの部分を見ると、色々に勉強できる。
faq/asm - hrb-wiki


まず、ジャンプ命令やコール命令について。
これらの命令には大きく分けて「相対short」「相対near」「絶対間接near」「絶対far」「絶対間接far」の5つがあります。
下にx86で使用されているジャンプ命令(上)とコール命令(下)を載せておきます。
ジャンプ命令とコール命令の大きな違いは「相対short」がジャンプ命令にしかない部分だと思います。
これは、for文などを使った際に関数の中でちょっとしたジャンプを行いたいときに相対shortジャンプ命令が便利だからだと思います。
コール命令ではこういった使いみちはないので、near以上の規模の命令でいいのでしょう。

オペコード命令説明
JMP rel8 次の命令との相対分量分だけ相対short ジャンプする。
JMP rel16 次の命令との相対分量分だけ相対near ジャンプする。
JMP rel32 次の命令との相対分量分だけ相対near ジャンプする。
JMP r/m16 r/m16 で指定されるアドレスに絶対間接near ジャンプする。
JMP r/m32 r/m32 で指定されるアドレスに絶対間接near ジャンプする。
JMP ptr16:16 オペランドで指定されるアドレスに絶対far ジャンプする。
JMP ptr16:32 オペランドで指定されるアドレスに絶対far ジャンプする。
JMP m16:16 m16:16 で指定されるアドレスに絶対間接far ジャンプする。
JMP m16:32 m16:32 で指定されるアドレスに絶対間接far ジャンプする。

オペコード命令説明
CALL rel16 相対near コール、次の命令とディスプレースメント相対。
CALL rel32 相対near コール、次の命令とディスプレースメント相対。
CALL r/m16 絶対間接near コール、r/m16 でアドレスを指定。
CALL r/m32 絶対間接near コール、r/m32 でアドレスを指定。
CALL ptr16:16 絶対far コール、オペランドでアドレスを指定。
CALL ptr16:32 絶対far コール、オペランドでアドレスを指定。
CALL m16:16 絶対間接far コール、m16:16 でアドレスを指定。
CALL m16:32 絶対間接far コール、m16:32 でアドレスを指定。