徒然ネル

LinuxカーネルとかeBPFとか

itmediaの「main()関数の前には何があるのか」を読んでみる(第二回)

itmediaの「main()関数の前には何があるのか」の連載を読んでわからなかったことや、調べたことをメモする

(作者サポートページ)

 

第二回は"「Hello World!」の主役printf()の内部動作をデバッガGDBで追う"

 

gdbserverを使う話が出てきた

Remote Debugging using GDB - CodeProject

https://www.codeproject.com/KB/mcpp/remote_debugging/3.jpg

 

 

printfの逆アセンブル結果のニーモニックleaがわからなかった

movはラベルを指定すると、ラベルの先にある中身をコピーする。

leaは、アドレスの先の中身ではなく、アドレスそのものをコピーする。

https://3iz.jp/try-assembly.html#:~:text=mov%E3%81%AF%E3%83%A9%E3%83%99%E3%83%AB%E3%82%92,%E3%81%9D%E3%81%AE%E3%82%82%E3%81%AE%E3%82%92%E3%82%B3%E3%83%94%E3%83%BC%E3%81%99%E3%82%8B%E3%80%82

movは中身の値、leaはアドレスをコピーするみたい

 

ニーモニックleaveも知らないな

調べてみると、

leave命令は、以下の2つの命令を組み合わせたのと同等の処理をします。

mov esp, ebp
pop ebp

https://vanya.jp.net/os/x86call/#enterleave:~:text=leave%E5%91%BD%E4%BB%A4%E3%81%AF,ebp%0Apop%20ebp

とのこと。

retの前に必要な処理みたい

retはスタックに積まれてるアドレスから呼び出しもとに戻る命令

上でも参照した以下のサイトが関数呼び出しについてわかりやすかった

x86アセンブリ言語での関数コール (vanya.jp.net)