画图解释一个汇编小例子
创始人
2025-06-01 01:44:47
0

这是对应的C代码

int caller() {int temp1 = 125;int temp2 = 80;int sum = add(temp1, temp2);return sum;
}int add(int x, int y) {return x + y;
}

这是对应的汇编代码:

caller:
push ebp
mov ebp, esp
sub esp, 24
mov [ebp-12], 125
mov [ebp-8], 80
mov eax, [ebp-8]
mov [esp+4], eax
mov eax, [ebp-12]
mov esp, eax
call add
mov [ebp-4], eax
mov eax,[ebp-4]
leaveadd:
push ebp
mov ebp, esp
mov eax, [ebp+12]
mov edx, [ebp+8]
add eax, edx
leave
ret

下面开始解释:

第一句:push ebp。push指令是压栈的意思。esp和ebp分别是指向栈顶和栈底的寄存器。push压栈过程:

1.先++,即esp往下走一个单位,起到了扩容的作用。2.把元素放入栈中。即把ebp寄存器内部的值压栈。

这一步的作用是保存上一个函数栈帧的基地址,在该函数(caller)结束之后,可以通过这一个基地址找到上一个函数的函数栈帧基地址。

第一句代码对应图示:

初始状态:
在这里插入图片描述

push后的状态.esp++(++指的是加一个单位),ebp的地址入栈
在这里插入图片描述


第二句:mov ebp esp。mov是移动的指令。这里写的是intel x86的汇编指令,因此这句话的意思是把esp寄存器内的地址复制一份到ebp寄存器内。也就是说:此时ebp指向esp所指向的地址。也就是栈顶。

第二句代码的图示如下:

在这里插入图片描述


第三句:sub esp, 24.意思是把esp减去24个字节。由于用户栈是向下生长的。越下面地址越小,因此减去24就是向下移动。这里假设一个格子是4字节,因此也就是esp向下移动6个格子。

在这里插入图片描述


第四,五句:mov [ebp-12], 125。ebp向下三个单位被写入一个立即数125.这个125对应的c语言代码是那个temp1,在c语言代码里,越早定义的局部变量越靠下。mov [ebp-8], 80表示ebp向下2个单位被写入一个立即数80.也就是c语言代码里的temp2

第四,五句对应图示如下:

在这里插入图片描述


至此,c语言代码我们现在执行到了这一条语句int sum = add(temp1, temp2);这一条语句涉及到的知识点有函数栈帧的传参的切换。首先要进行的是函数栈帧的传参。要把temp1和temp2两个参数传给add这个函数栈帧。

第6,7,8,9句代码:

mov eax, [ebp-8]
mov [esp+4], eax
mov eax, [ebp-12]
mov esp, eax

首先我们要明确的是:函数传参时,参数应该存在函数栈帧的靠下的部分。

由于汇编当中不允许将内存里的东西mov到内存里。所有我们要借助一个寄存器eax来进行写入。因此这四句话的意思就是,我先把[ebp-8]里面的内容mov到eax里面,然后再将eax里面的内容mov到[esp+4]里面。后面两句同理。

这四句代码的图示如下:

在这里插入图片描述


第十句代码:call add。add是一个标识符。这句话就表示我现在要调用add函数了。当使用了call指令的时候,会将当前指令的地址入栈。(也就是PC程序计数器记录的指令地址,在intel x86里面PC程序计数器叫做IP寄存器。)入栈之后,就跳转到了add的函数栈帧里面了

第十句代码对应的图如下:

在这里插入图片描述


第11,12句代码:和之前同理,作用就是为当前函数开辟空间。(开辟函数栈帧)。这两句代码是每一个函数都需要的,因为它可以为函数栈帧分配空间。这两句话也可以合起来被称为enter指令


第13,14,15句代码:

mov eax, [ebp+12]
mov edx, [ebp+8]
add eax, edx

就是把两个参数temp1和temp2拿到寄存器里面相加。相加后放入到eax里面保存。

这里要说一下add函数栈帧是如何找到caller函数栈帧传入的temp1和temp2两个参数的。

在这里插入图片描述


第16句代码:leave。leave和enter一样也是一个缩写的指令。leave完整写出来应该是

mov ebp, esq  将esp指向ebp,其实就是收回函数栈帧的空间
pop ebp 将弹出的元素放到ebp里面。这里弹出的元素就是上一个函数栈帧的基地址。

leave把add的最上面那个栈内元素,也就是上一个函数栈帧的ebp地址获取后弹出了,现在ebp回到了上一个函数栈帧的ebp位置,也就是caller的ebp位置。

在这里插入图片描述


第17句代码 ret。

ret会把栈顶的IP寄存器所保存的指令地址获取并弹出。这样我们就可以找到我们原来执行到哪一条指令了。

我们将会回到call add这条代码处继续往下执行。

注意区分PC寄存器里的指令地址和ebp的基地址的区别。

基地址是函数栈帧栈底的地址,PC寄存器记录的是我们执行到了哪一条指令。

图示:我们可以发现栈顶(最底下)的ip寄存器已经被pop掉了。

在这里插入图片描述


第18, 19, 20句代码

mov [ebp-4], eax
mov eax,[ebp-4]
leave

刚刚add函数帮我计算的结果被保存在了eax寄存器里面。因此我们可以通过访问eax寄存器来得到这个结果,并把它放到sum这个局部变量里。至此,程序结束

相关内容

热门资讯

从“于台龙虾”到“苏超盛宴” □ 江 东 这些天,“苏超”火爆出圈,让人想到当年的“于台龙虾”。当年,盱眙名不见经传,很多人...
小学单元整体教学设计展评   近日,乳山口镇中心学校开展“基于核心素养的小学单元整体教学设计”成果展评活动,选树典型,榜样引领...
朝阳站周边司机随意违停揽客   遮挡车牌,议价揽客,在临时落客区长期停放……不少乘客反映,节假日北京朝阳站周边出租车及网约车存在...
是说了再见不再见,一句再见就是... 是说了再见不再见,一句再见就是两个人最后的一句话既然无缘,何必再执着,各自退到原点,只留下彼此之间最...
王文涛部长会见世贸组织总干事伊... 转自:上观新闻6月3日,商务部部长王文涛在法国巴黎出席世贸组织小型部长会议期间,会见世贸组织总干事伊...
高考在即,运输服务温情相伴十九... 福州:的哥(姐)爱心启航,为梦助力。莆田:爱心车队出动,暖心护航。漳州:公交护航,助考生逐梦。从福建...
坚持问题导向 厉行真查实改 转自:光明日报  日前,在江西省赣州市宁都县竹笮镇机关食堂,一场跨乡镇调研结束后,县直单位下乡工作人...
高压电缆“扛冻”有了数据支撑 转自:天津日报  本报讯(记者 苏晓梅)华北地区近年来寒潮频发,作为城市“电力动脉”,电缆如何扛住低...
文言文 苏秦苦学 文言文 苏秦苦学苏秦乃洛阳人,学纵横之术,游说秦王,书十上,而不为用,资用匮乏,潦倒而归。至家,妻不...
时间顺序和故事发展顺序有什么区... 时间顺序和故事发展顺序有什么区别, 时间顺序就是每篇文章每段段落里有明显提到时间的词 比如 早上...
怎么实现两台电脑文件共享 怎么实现两台电脑文件共享两台电脑在同一网络下,在对应的文件夹,进入高级共享此文件夹,赋予权限,另外一...
生生世世刻吾名什么意思 生生世世刻吾名什么意思生生世世刻吾名:生生世世将我的名字刻在上面出自辰东的《遮天》第一千七百四十九章...
墨西哥发生巴士翻车事故,已致1... 转自:上观新闻当地时间6月3日凌晨,在墨西哥新莱昂州瓦拉乌伊塞斯市发生一起严重巴士翻车事故,造成至少...
一半以上新面孔,中国女排 “换... 转自:上观新闻6月4日,中国女排将迎来2025年世界女排联赛北京站首秀,对手是比利时女排。对于中国女...
强化品牌赋能 让赛事有温度带热... 5月30日下午,“魅力江苏 最美体育”系列品牌赛事活动暨全民健身进基层公益培育志愿服务启动仪式在南京...
端午敬老送安康,中医义诊暖人心   在端午佳节来临之际,文登区张家产镇卫生院中医团队随健康查体队伍走进张家产镇敬老院,用传统技艺为老...
播撒科学种子 共筑强国梦想 转自:天津日报  当白发苍苍的航天专家徐宝强教授指着雷达荧光屏上清晰的天津地貌,动情地说出“科学研究...
外盘头条:特朗普签署钢铝关税令...   全球财经媒体昨夜今晨共同关注的头条新闻主要有:  1、美国白宫宣布提高进口钢铝关税至50% 对英...
《政务数据共享条例》将带来哪些... 国务院3日对外公布《政务数据共享条例》,对政务数据的目录管理、共享使用、平台支撑等工作进行部署。条例...
国网乳山供电:厉兵秣马,打响高...   6月3日,国网乳山市供电公司城东供电所彩虹共产党员服务队员对全市高考考点、保密场所、指挥中心周边...