Content #
跳转到函数体之后即开始执行函数,而i386函数体的“标准”开头是这样的(但也可以不一样):
- push ebp 把ebp压入栈中(称为old ebp)。
- mov ebp, esp ebp = esp(这时ebp指向栈顶,而此时栈顶就是old ebp)。
- 【可选】sub esp, XXX 在栈上分配XXX字节的临时空间。
- 【可选】push XXX 如有必要,保存名为XXX寄存器(可重复多个)。
把ebp压入栈中,是为了在函数返回的时候便于恢复以前的ebp值。而之所以可能要保存一些寄存器,在于编译器可能要求某些寄存器在调用前后保持不变,那么函数就可以在调用开始时将这些寄存器的值压入栈中,在结束后再取出。
From #
程序员的自我修养