代码
点击查看代码以上代码考虑2个问题:问题1:main函数调用sum,sum执行完成以后,怎么知道回到哪个函数中?问题2:sum函数执行完后,回到main后,怎么知道从哪一行指令继续执行的?//------------------------------------------------------------------------------------------------------------------#include <iostream>using namespace std;int sum(int a,int b){ int temp=0; temp=a +b; return temp;}int main(){ int a =10; int b=20; int ret =sum(a,b); return 0;}
文章插图
//------------------------------------------------------------------------------------------------------------------函数参数压栈
文章插图
//------------------------------------------------------------------------------------------------------------------函数参数压栈
文章插图
//------------------------------------------------------------------------------------------------------------------下一条汇编指令地址入栈
文章插图
//------------------------------------------------------------------------------------------------------------------main函数栈底指针入栈
文章插图
//------------------------------------------------------------------------------------------------------------------移动ebp,进入被调函数
文章插图
//------------------------------------------------------------------------------------------------------------------为sum函数开辟函数栈帧
文章插图
//------------------------------------------------------------------------------------------------------------------将返回值放入寄存器
文章插图
//------------------------------------------------------------------------------------------------------------------回退esp栈指针
文章插图
//------------------------------------------------------------------------------------------------------------------将ebp指回main函数栈底
文章插图
//------------------------------------------------------------------------------------------------------------------取出下一条执行的汇编指令地址并执行
文章插图
//------------------------------------------------------------------------------------------------------------------
文章插图
此时 esp , ebp 又指向了main函数的栈底指针和栈顶指针//------------------------------------------------------------------------------------------------------------------
文章插图
【<一>从指令角度了解函数堆栈调用过程】
推荐阅读
- .NET Conf 2022 &ndash; 11 月 8 日至 10 日
- 聊一聊对一个 C# 商业程序的反反调试
- 十 前后端分离项目:实现"改"功能(前后端)
- 原神无忧节最后一个兰纳罗位置在哪
- 红魔6参数配置_红魔6参数配置详情
- 三 Java多线程-ThreadPool线程池
- 一 Abp.Zero 手机号免密登录验证与号码绑定功能的实现:验证码模块
- c++ 模板 指针类型偏特化
- 一个实用的 vite + vue3 组件库脚手架工具,提升开发效率
- 二、.Net Core搭建Ocelot