カーネルコードを書いていて詰まったのでまとめておきます
個人的によく使う「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の領域に存在するメモリの値を番地だと認識し、その番地へコールします。
他のレジスタも概ね使えると思います。