レジスタの命令のお勉強
前回、C言語とGo言語のコンパイル後のバイナリ比較などをやってました。
今回は、どちらかというとReversingに向けて命令の勉強を・・・。
ということで、それぞれのバイナリで出てきた命令の意味を確認してみます。
# C言語
C言語で出てきた命令は以下。
push, mov, lea, call, pop, retn, jmp
それぞれ確認してみます。
## push
push rbp
→rbpをスタックにpushしている。
呼び出し元のメモリ番地をスタックに保存するらしい。
処理の最初に入るおまじないの一つ。
## pop
pop rbp
→スタックから番地を取り出してrbpへ格納する。
関数の終わりで利用される。
## mov
mov rbp, rsp
→rspをrbpに代入している。
rspはスタックのトップのメモリ番地のようです。
処理の最初に入るおまじないの一つ。
mov自体は
・レジスタに値を入れる
・レジスタ間で値を転送する
・メモリからレジスタへ値を転送する
・メモリへレジスタから値を転送する
が可能
## lea
lea rax [0x602060]
→[0x602060]のアドレスをraxレジスタに代入する
2番目の引数には必ずメモリのアドレスが入る
参考資料:x86-64プロセッサのスタックを理解する - Qiita
思ったより理解に時間がかかってしまっていたので、また次回・・・。。
以上。