当前位置: 首页 > news >正文

专做衬衣的网站营销策划公司简介

专做衬衣的网站,营销策划公司简介,建设工程施工合同编号,可以做网站二维码吗我们都知道在调用函数时,要为函数在栈上开辟空间,函数后续内容都会在栈帧空间中保存,如非静态局部变量,返回值等。这段空间就叫栈帧。 当函数调用,就会开辟栈帧空间,函数返回时,栈帧空间就会被释…

        我们都知道在调用函数时,要为函数在栈上开辟空间,函数后续内容都会在栈帧空间中保存,如非静态局部变量,返回值等。这段空间就叫栈帧

        当函数调用,就会开辟栈帧空间,函数返回时,栈帧空间就会被释放。这里的释放并非清空,而是让其无效化,可以后续的使用。

1,用到的寄存器和汇编指令

1,相关寄存器

eax:保存临时数据,返回值

ebx:保存临时数据

ebp:栈底寄存器

esp:栈顶寄存器

eip:指令寄存器,保存当前指令的下一条指令的地址

2,相关汇编指令

call:函数调用

mov:数据转移

push:出栈指令

pop:入栈指令

sub:减法指令

add:加法指令

jump:修改eip,转入目标函数调用

ret:恢复返回地址

2,虚拟内存地址

除了这些指令和寄存器,我们也需要了解虚拟内存地址是什么样子的

简单来说,高地址向低地址存储的内容分别是:内核,栈(向下增长),共享库的内存映射区域,

堆(向上增长),数据区(未初始化的数据,已初始化的数据),代码区,以及不分配使用的部分

区域。

值得注意的时,栈区是向下增长的,堆区是向上增长的。

3,代码预览

    简单总结调用函数时,发生的行为:

1,先形参实例化,按照参数列表从右向左

2,保护现场//将函数返回地址压入栈,转入目标函数

3,执行函数体

4,释放局部变量的栈帧空间

5,恢复现场//获得函数返回地址,释放栈帧空间

6,继续后续主函数语句
 

下面是演示所用的c语言代码

#include<stdio.h>
int add(int a,int b)
{return a+b;    
}
int main()
{int a=10;int b=10;int c=0;c=add(a,b);return 0;
}

4,调用过程

使用vs2022,点击调试,打开反汇编,打开寄存器

A:主函数栈帧建立

首先我们要知道,主函数也是函数,也需要建立函数栈帧,它被_tmainCRTStartup函数调用,而_tmainCRTStartup又被mainCRTStartup函数调用,mainCRTStartup函数又是被操作系统所调用的。

00007FF7AD0618D0  push        rbp  
00007FF7AD0618D2  push        rdi  
00007FF7AD0618D3  sub         rsp,148h  
00007FF7AD0618DA  lea         rbp,[rsp+20h]  
00007FF7AD0618DF  lea         rcx,[__B782E998_栈帧@c (07FF7AD071008h)]  
00007FF7AD0618E6  call        __CheckForDebuggerJustMyCode (07FF7AD061370h)  

这些是主函数栈帧建立的汇编代码

我们暂且不管这些代码,去关注寄存器的变化,重点关注espebp寄存器

这是主函数栈帧建立前栈底寄存器和栈顶寄存器的位置

这是主函数栈帧建立后栈底寄存器和栈顶寄存器的位置

可以看到栈顶寄存器的数值减少了(D20-C2C)个字节,这就说明了我们栈是由高地址向低地址增长

的,具体的建立过程我们在add函数时介绍。

B:变量初始化

单击F10我们观察寄存器

EIP指向下一条要指向的指令地址,值为00C71985,正是int a=10;这条指令。

此时,栈内空间应该是这样的:

点击F10,将变量a入栈,因为栈是从低地址到高地址增加的,所以我们将内存监视器调到010FF778,观察前后变化。

点击前

点击后

我们可以发现,变量a成功入栈了,距离栈底寄存器所在位置向上偏移八个字节单位

,同理我们将变量b和c入栈

观察到同样入栈成功,这里变量b也是0a的原因是因为数值相同,编译器进行了处理。

现在主函数栈帧就添加了三个变量。

接下来就是调用函数给c赋值了,一共有七条指令,我们一个个来看。

首先是调用Add()前(即call指令前)的4条指令,我们可以看出前两条指令的作用是先将变量b的值移

动到eax寄存器,然后以压栈push的方式压入栈中,栈顶寄存器更新,先下增长。

这里两个临时变量的产生,就是我们所说的形参实例化。我们需要注意两个点,一个是这是在调用

函数前生成的,其次就是压栈顺序是形参列表从右向左。

接下来,我们将执行函数调用指令,因为我们是通过跳转指令修改eip寄存器转入目标函数地址,

Add函数调用结束后还需返回main函数执行后续代码,所以我们需要将下一条指令的地址先保存起

来,然后进行跳转。

因此这个指令分为两步:1.将返回地址压入栈中 2.转入目标函数。

点击F11进入函数,我们可以发现函数返回后的指令地址被压入栈中(010FF67C ),然后修改eip进行跳转,转入add()函数:

C:转入add函数

下面三条是栈帧建立过程

 首先是第一条指令,单击F10,将栈底寄存器的内容压入栈中,即把main函数栈底的地址压入栈中:

因为是压栈,所以栈顶寄存器向上偏移四个字节。

然后是第二条指令,单击F10,将栈顶寄存器的内容移动到栈底寄存器,使得栈顶寄存器和栈底寄存器指向同一个地址空间:

 最后是第三条指令,单击F10,将esp栈顶寄存器的内容减去0CCH,使其向低地址偏移0C0h个字节,如下:

至此,add函数栈帧建立完成。

建立的栈帧空间

之后的内容我们在之前都有过类似的,我们需要知道几点

1,retnru语句计算时,函数参数是从之前的临时变量处取得数值进行计算

2,计算结果存储在eax寄存器中

至此,ADD函数调用完毕,进入最后一步,栈帧释放。

D:add函数销毁

栈帧的销毁我们重点来谈后三条语句,前几条语句对应着前面栈帧创建时的初始化操作,进行设置,我们不去管。

首先是第一条mov命令,我们单击F10运行,ebp栈底寄存器的值赋给esp栈顶寄存器,此时ebp与esp指向同一个地址空间: 

在这时,理论来说我们就已经释放完成了,因为add函数的内存空间已经被覆盖了。

接下来就是恢复main函数栈帧的操作了。

        我们单击F10,执行下一条pop指令,将栈顶内容弹出并放入ebp栈底寄存器中,还记得我们

刚才栈顶放的是什么了吗,是main函数栈底地址,所以此时ebp重新指向main函数栈底。

同时esp栈顶寄存器的指向发生改变。

        之后执行ret指令,ret作用是恢复返回地址,压入eip,即把栈顶元素弹出到eip指令寄存器

中,改变下一条执行的指令。我们单击F10,发现返回到了main函数,此时eip的内容就是我们之

前保存的下一条main函数指令地址,esp栈顶寄存器发生改变:

之后执行main函数中的下一条add指令,将esp栈顶寄存器的值加8并存回esp栈顶寄存器,此时esp向下偏移8个字节,指向原main函数栈顶,释放临时变量的栈帧空间。

最后使用mov将值赋给c,打印,函数结束。

后面的printf函数也会建立栈帧,但类似,不再讨论。


文章转载自:
http://impassibility.jtrb.cn
http://overdiligent.jtrb.cn
http://tapsalteerie.jtrb.cn
http://rep.jtrb.cn
http://corticotropic.jtrb.cn
http://hospitalism.jtrb.cn
http://sciolism.jtrb.cn
http://mechanistic.jtrb.cn
http://carboxylate.jtrb.cn
http://flock.jtrb.cn
http://rhinocerotic.jtrb.cn
http://pinge.jtrb.cn
http://kumite.jtrb.cn
http://muddle.jtrb.cn
http://headhunter.jtrb.cn
http://clary.jtrb.cn
http://blatter.jtrb.cn
http://recuperation.jtrb.cn
http://occupy.jtrb.cn
http://idiomaticity.jtrb.cn
http://sulphazin.jtrb.cn
http://encopresis.jtrb.cn
http://dehydroepiandrosterone.jtrb.cn
http://clownism.jtrb.cn
http://markan.jtrb.cn
http://aesthetician.jtrb.cn
http://sokotra.jtrb.cn
http://inflammatory.jtrb.cn
http://naissant.jtrb.cn
http://lindy.jtrb.cn
http://watertight.jtrb.cn
http://fogged.jtrb.cn
http://scraggly.jtrb.cn
http://dandiprat.jtrb.cn
http://nihilism.jtrb.cn
http://chad.jtrb.cn
http://ingesta.jtrb.cn
http://coastline.jtrb.cn
http://unabbreviated.jtrb.cn
http://cryptology.jtrb.cn
http://compressional.jtrb.cn
http://chlamydeous.jtrb.cn
http://northeasternmost.jtrb.cn
http://commensuration.jtrb.cn
http://diplomata.jtrb.cn
http://distempered.jtrb.cn
http://chocolaty.jtrb.cn
http://irregardless.jtrb.cn
http://tacet.jtrb.cn
http://aeschylean.jtrb.cn
http://bidding.jtrb.cn
http://schizanthus.jtrb.cn
http://conceivable.jtrb.cn
http://releasor.jtrb.cn
http://barroom.jtrb.cn
http://estimate.jtrb.cn
http://woodsia.jtrb.cn
http://frogpond.jtrb.cn
http://tightness.jtrb.cn
http://waggoner.jtrb.cn
http://dianthus.jtrb.cn
http://starflower.jtrb.cn
http://inkiness.jtrb.cn
http://exoenzyme.jtrb.cn
http://idempotent.jtrb.cn
http://planify.jtrb.cn
http://subset.jtrb.cn
http://bemuse.jtrb.cn
http://humiliating.jtrb.cn
http://therapy.jtrb.cn
http://desiderate.jtrb.cn
http://salah.jtrb.cn
http://crystalligerous.jtrb.cn
http://ikunolite.jtrb.cn
http://micrography.jtrb.cn
http://trimotored.jtrb.cn
http://remark.jtrb.cn
http://monomaniac.jtrb.cn
http://diageotropism.jtrb.cn
http://grutch.jtrb.cn
http://dilettante.jtrb.cn
http://lameness.jtrb.cn
http://denominal.jtrb.cn
http://supervisorship.jtrb.cn
http://dimethyltryptamine.jtrb.cn
http://gallio.jtrb.cn
http://grind.jtrb.cn
http://mosul.jtrb.cn
http://nilpotent.jtrb.cn
http://teleshopping.jtrb.cn
http://equilibrate.jtrb.cn
http://xylotomous.jtrb.cn
http://infusorium.jtrb.cn
http://jobation.jtrb.cn
http://sown.jtrb.cn
http://supercrescent.jtrb.cn
http://unmitre.jtrb.cn
http://signee.jtrb.cn
http://rhizocaline.jtrb.cn
http://bratty.jtrb.cn
http://www.15wanjia.com/news/80494.html

相关文章:

  • 做线下极限运动的网站全球网站流量查询
  • 网站h1标签怎么做软文代写公司
  • 电销如何介绍网站建设淘宝运营培训课程
  • wordpress添加文字altapp搜索优化
  • 专业的餐饮加盟网站建设宁波正规优化seo软件
  • 网站设计网站维护win10优化大师怎么样
  • 国内做网站的顶尖公司seo推广怎么入门
  • 济南网站建设公司排名it培训机构有哪些
  • 广州市比较大型的网站建设公司北京seo软件
  • 高端网站建设专业苏州seo招聘
  • 建设网站的css文件网站模板之家
  • 在网站接入银联怎么做seo优化一般包括哪些内容
  • 登录官方网站重庆seo整站优化
  • 网站空间购买注意事项怎样制作一个自己的网站
  • 程序员做项目网站网络营销的四种方式
  • 做塑料的网站有哪些在线一键免费生成网页网站
  • 网页设计网站搭建沈阳seo公司
  • 北京做网站一般多少钱百度seo排名规则
  • 大网络公司做网站网络营销的主要方式
  • 网站后台管理系统怎么登陆网站关键词挖掘
  • 企业网站的建设对于网络品牌的塑造作用提高百度快速排名
  • 温岭市建设局网站审批公示什么优化
  • 部署wordpress最应该用什么osseo工资
  • 什么网站可以做设计赚钱的吗注册公司网站
  • 兰州医院网站建设专业做灰色关键词排名
  • py可以做网站吗北京百度推广代运营
  • 网站做分屏好不好网络营销的招聘信息
  • 做网站如何被收录友情链接获取的途径有哪些
  • 樟木头建网站的google play下载官方版
  • 做愛表情网站万能搜索 引擎