函数调用完成控制转移之后的栈形态


从图中可以看到,在完成了控制转移等一系列操作之后,函数的第一个实参的地址在 的位置上,这是由于前面依次是 EBP旧值返回地址 两个指针,各占据了4个字节

注意,在函数压栈的时候,入口参数是返序压栈的,即先压入栈中的是最后一个参数,而在C语言中写在最前面的参数最靠近 ebp


注意事项:

  1. 做题的时候注意题目给出的立即数是小端还是大端方式存放的
  2. 看汇编写C语言的时候,除了要注意数据的大小,还要通过指令的类型来区分是有符号数还是无符号数
  3. 函数调用的几条指令分别的作用:
    1. leave 的作用只是先把当前的 esp 设置为当前 ebp 的值,然后把 ebp 恢复成 ebp 旧值
    2. ret 指令的作用是通过上一步恢复的 esp 取出返回地址,把 eip 的值指向返回地址,移交控制权限
    3. call 的作用是保存返回地址,然后移动 eip 到指定位置,移交控制权限