书上是这样写的“程序在执行过程中,如果遇到了对其他函数的调用,则暂停当前函数的执行,保存下一条指令的地址(即返回地址,作为从子函数返回后继续执行的入口点),并保存现场,然后转到子函数的入口地址,执行子函数。……”
3 回答

蛊毒传说
TA贡献1895条经验 获得超3个赞
C++中函数调用的执行过程有六步:
1、参数传递:将函数参数压栈:mov eax,dword ptr [n] ;(n为参数变元)。
2、操作:将帧指针压入栈中:push ebp;使得帧指针等于栈指针:mov ebp,esp;使栈指针自减,自减得到的内存地址应当能够(足够)用来存储被调用函数的本地状态:sub esp,0CCh。
3、传入保存状态:push ebx ;保存ebx寄存器的值;push esi ;保存esi寄存器的值;push edi ;保存edi寄存器的值。
4、装入edi:lea edi,[ebp-0CCh] ;0cch是当前活动记录的大小。
5、恢复传入的保存状态:00411417 pop edi;00411418 pop esi;pop ebx栈指针上移,恢复空间;add esp,0CCh。
6、函数返回释放空间:使栈指针等于帧指针: mov esp,ebp;从栈中将旧的帧指针弹出: pop ebp;返回:ret。

弑天下
TA贡献1818条经验 获得超8个赞
怎么说的跟中断似的...
函数调用就好像堆积木一样。调用方调用一个函数的时候,被调用的函数是直接摞在调用方上面的;被调用的函数返回的时候也就好像直接把放在上面的积木拿开。
另外“现场”是不会被保存的。这不是中断,函数返回后CPU的状态不能保证和调用前相同。只是函数使用的栈内存因为互不相干,所以一般不会被改变(除非你主动去改)
- 3 回答
- 0 关注
- 149 浏览
添加回答
举报
0/150
提交
取消