问题一:sum函数执行完毕,计算机怎么知道继续执行哪条指令?
函数运行时要在栈帧上开辟空间,esp寄存器存储的是当前函数栈顶的位置,ebp寄存器存储的是当前函数栈底的位置
首先main函数调用sum函数,第一件事是将下一条指令的地址压栈
栈帧开辟详细细节
第二件事是开辟sum函数的栈帧空间
1、push ebp 保存调用方函数的栈底地址
2、执行 mov ebp, esp 将esp赋值给ebp,此时ebp指向sum函数栈帧的栈底
栈是从高地址向低地址增长的。也就是说,当你向栈中压入新的数据时,栈顶的地址实际上是在减小。
3、执行 sub esp, 为sum函数开辟的栈帧大小 来为sum函数开辟栈帧空间
4、(可选)对栈帧初始化,比如有的vs编译器会均初始化为0xCCCCCCCC,结果是打印未初始化的int值为-858993460
栈帧回退细节
执行 mov esp, ebp
pop ebp
CPU的PC寄存器存放的是下一条指令的地址,从栈顶弹出下一条指令的地址放到CPU的PC寄存器
示例
main函数中调用sum函数
1 | #include <iostream> |
执行 g++ -S calldetail.cpp
对应的汇编代码:
1 | .file "calldetail.cpp" |
作者:张泽中