函数的调用
函数调用完成控制转移之后的栈形态
从图中可以看到,在完成了控制转移等一系列操作之后,函数的第一个实参的地址在 EBP旧值
和 返回地址
两个指针,各占据了4个字节
注意,在函数压栈的时候,入口参数是返序压栈的,即先压入栈中的是最后一个参数,而在C语言中写在最前面的参数最靠近
ebp
注意事项:
- 做题的时候注意题目给出的立即数是小端还是大端方式存放的
- 看汇编写C语言的时候,除了要注意数据的大小,还要通过指令的类型来区分是有符号数还是无符号数
- 函数调用的几条指令分别的作用:
leave
的作用只是先把当前的esp
设置为当前ebp
的值,然后把ebp
恢复成ebp
旧值ret
指令的作用是通过上一步恢复的esp
取出返回地址,把eip
的值指向返回地址,移交控制权限call
的作用是保存返回地址,然后移动eip
到指定位置,移交控制权限
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.