Open9
x86エミュレーター自作勉強会 2021/06/27
おはようございます。
call命令は jmp + push ret命令は jmp + pop と似ている動作をしているが jmpはパイプラインフラッシュが行われている。 eipを直接書き換えることはできないため。 callやretが必要になる。
int add (int a, int b){
reutnr a + b;
}
引数はスタックに積まれて。関数内部でpopして扱われる。
32bitだと 引数はスタックにつまれる。
64bitだとどうやらレジスタに入れられている。
ここらへんは大きな違いとしてある。
参考文献
P110まで終了 次回 gdp-pedaをつかて。 eip esp ebpの動きを確認する。
x86とx86_64の関数呼び出しの違い。
x86: 引数をスタックにpush https://gcc.godbolt.org/z/hGh795x1E
x86-64: 引数をレジスタにセット https://gcc.godbolt.org/z/fcaaMvP1z
gdb-peda Dockerfile
「push 汎用レジスタ」の機械語は0x50にレジスタ番号を足した数値になります。ebpレジスタの 番号が5ですから0x50+5=0x55となるのです。