FromNandの日記

自分的備忘録

【GAS】call・jmp命令のいろんな書き方【call *%eaxは?】

カーネルコードを書いていて詰まったのでまとめておきます

個人的によく使う「call・jmp」のうち、戸惑ったものを乗せます

レジスタに対して付ける「*」が非常に分かりづらいです(call *%eaxやcall *4(%esp)など)

https://stackoverflow.com/questions/21324087/what-c-code-would-compile-to-something-like-call-eax

 

【call】

「call %eax」

eaxに格納されているアドレスにジャンプする。

しかし、コードセグメントのベースアドレスを引いておくことを忘れないように!

(例えば、cs == 1で1番目のセグメントのベースが0x300000であれば、(コール先のアドレス - 0x300000)をeaxに入れておくべき)

「call *%eax」

書き方が違うだけで、上の記述と全く同じ意味(紛らわしい)

何度も実験したので正しいと思います。

あと、上に貼ったURLにもその事が書いてあります。

「call *0x????????」

0x????????に指定した番地に格納されている4byteの番地にジャンプします。

0x????????自体にジャンプするわけではないことに注意!!

コードセグメントやデータセグメントのベースやリミットを意識するべきです。

「call 0x????????」

0x????????にジャンプします。

「call 4(%esp)」もしくは「call *4(%esp)」

esp + 4の領域に存在するメモリの値を番地だと認識し、その番地へコールします。

他のレジスタも概ね使えると思います。

 

【jmp】

「jmp %eax」

eaxに格納されているアドレスにジャンプする。

しかし、コードセグメントのベースアドレスを引いておくことを忘れないように!

(例えば、cs == 1で1番目のセグメントのベースが0x300000であれば、(コール先のアドレス - 0x300000)をeaxに入れておくべき)

「jmp *%eax」

書き方が違うだけで、上の記述と全く同じ意味(紛らわしい)

何度も実験したので正しいと思います。

「jmp *0x????????」

0x????????に指定した番地に格納されている4byteの番地にジャンプします。

0x????????自体にジャンプするわけではないことに注意!!

コードセグメントやデータセグメントのベースやリミットを意識するべきです。

「jmp 0x????????」

0x????????にジャンプします。

「jmp 4(%esp)」もしくは「jmp *4(%esp)」

esp + 4の領域に存在するメモリの値を番地だと認識し、その番地へコールします。

他のレジスタも概ね使えると思います。