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

如何建立公司的微信公众号seo技术306

如何建立公司的微信公众号,seo技术306,个人网站电商怎么做,泉州做网站工资目录 引言 基础知识 内存模型 ​ 寄存器的种类与功能 常用的汇编指令 函数栈帧创建与销毁 main()函数栈帧的创建 NO1. NO2. NO3. NO4. NO5. NO6. main()函数栈帧变量的创建 调用Add()函数栈帧的预备工作——传参 NO1. NO2. NO3. Add()函数栈帧的创建 …

目录

引言

基础知识

内存模型  ​

寄存器的种类与功能

常用的汇编指令

函数栈帧创建与销毁

main()函数栈帧的创建

NO1. 

NO2.

NO3. 

NO4.

NO5. 

NO6.

main()函数栈帧变量的创建

调用Add()函数栈帧的预备工作——传参

NO1.

NO2.

NO3. 

Add()函数栈帧的创建

Add()函数栈帧变量的创建并运算

NO1.

NO2.

NO3. 

NO4. ​

Add()函数栈帧的销毁 ​

NO1. ​

NO2. ​

NO3. ​

返回main()函数栈帧

问题

NO1.

NO2.

NO3.


引言

在前期学习当中,我们可能会有很多困惑?比如

  • 局部变量是怎么创建的?
  • 为什么局部变量的值是随机?
  • 函数是怎么传参的?传参的顺序是怎样的?
  • 形参和实参是什么关系?
  • 函数调用是怎么做的?
  • 函数调用是结束后怎么返回的?

建议大家在观察函数栈帧创建与销毁时,使用的环境不需要太高级的编译器,越高级的编译器,越不容易学习和观察。同时在不同的编译器下,函数调用过程中栈帧的创建是略有差异的,具体细节取决于编译器的实现。 

基础知识

电脑中的任何指令都在CPU上运行,但CPU只负责运算不负责存储。

数据都存储在寄存器缓存内存中。

想了解函数栈帧的创建和销毁我们就需要了解到:内存模型,寄存器常用汇编指令。

那关于寄存器和缓存等之间的关系,会在后面的博文讲解到。 

内存模型  

 这只是一个大致的介绍,后面博文我们也会详细去介绍到内存模型。

寄存器的种类与功能

 在我们的函数栈帧创建与销毁。我们重点使用到ESP和EBP。

  • ESP(esp):栈指针寄存器(extended stack pointer)栈顶指针,堆栈的顶部是地址小的区域,压入堆栈的数据越多,esp也就越来越小。在32位平台上,esp每次减少4个字节。其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的栈顶。是CPU机制决定的,push,pop等指令会自动调整esp的值。
  • EBP(ebp):基址指针,指栈的栈底指针基址指针寄存器(extended base pointer)。一般与esp配合使用,可以存取某时刻的esp,这个时候就是进入一个函数内后,CPU会将esp的值赋给ebp,此时刻就可以通过ebp对栈进行操作。比如获取函数参数,局部变量等。其内存放一个指针,该指针永远指向系统栈最上面一个栈帧的底部。

  • espebp这两个寄存器放置的是地址,这两个地址是用来维护函数栈帧的。每个函数调用,都需要在栈区创建一个空间。当正在调用某函数时,espebp就维护这个函数栈帧的空间。
  • 栈区使用:从高地址向低地址消耗/使用

常用的汇编指令

这里我们只讲解几个我们函数栈帧创建等的汇编指令

函数栈帧创建与销毁

了解了上面的基础知识,我们先大致来看下函数栈帧怎样创建与销毁 。

首先我们有想过一个问题吗?就是main()函数也是函数,那也是被哪个函数调用的吗?

当然。在VS2013中,main()函数也是被其他函数调用的

接下来我们进入正题,函数栈帧的创建与销毁。示例代码:

//函数栈帧创建与销毁
#include<stdio.h>
int Add(int x, int y)
{int z = 0;z = x + y;return z;
}
int main()
{int a = 20;int b = 10;int c = 0;c= Add(a, b);printf("%d\n", c);return 0;
}
//为了细致全方面去观察函数栈帧的创建与销毁,所以把代码拆分的很细
//F10调试-----→转到反汇编
//转到汇编语言去观察时记得把符号名去掉,更易观察

main()函数栈帧的创建

NO1. 

首先我们知道关于此时此时栈区_tmainCRTStartup()函数被调用了,接下来它需要调用main() 

 PUSH 把字压入堆栈。

 先将ebp的值这个空间大小放置到栈区新开辟的栈帧中。

 再将esp向上移动到ebp的栈顶的位置。

(esp的值减少4个字节,值减少了ebp这么多的空间大小)

首先esp的值减少4个字节,再将ebp的值压入栈中。

 NO2.

 MOV 传送字或字节。

 将esp的值赋给ebp。这里并不是将esp所指向内存空间的值赋给ebp

NO3. 

 SUB 减法.

 将esp-0E4H(228)即将esp指针向低地址方向移动0E4H字节。

NO4.

此刻我们发现mian()函数有自己栈区所欲开辟的新空间,那接下来? 

  •  首先将esp的值减少4个字节,再将ebx的值压入栈中。
  •  首先将esp的值减少4个字节,再将esi的值压入栈中。
  •  首先将esp的值减少4个字节,再将edi的值压入栈中。

(不确定顺序先后?)

NO5. 

LEA(lea):load加载。 load effective address

[ebp-0E4h]这么多的空间大小放到edi里面去。

NO6.

以上四段汇编代码的意思是:

edi这个位置向下的39h 这么多的空间大小的双字节dword(4个字节)全部放置为0CCCCCCCCh 这样的内容。

每一次初始化dword,共初始化19h次。

main()函数栈帧变量的创建

  MOV 传送字或字节。

  把0AH(10)的值赋给 地址为[ebp-8] 的双字节空间

  把14h(20)的值赋给 地址为[ebp-14h] 的双字节空间

  把0的值赋给 地址为[ebp-20h] 的双字节空间  

那如果没有初始化呢?

 那么abc的位置就会被初始化为CCCCCCCC随机值。打印abc的时候也就是随机值。

调用Add()函数栈帧的预备工作——传参

NO1.

MOV PUSH 

  • 将地址为[ebp-14h] 双字节空间大小 的值赋给eax
  • esp的值减少4个字节,将eax压栈到栈中

NO2.

 MOV PUSH

  • 将地址为[ebp-8]双字节空间大小 的值赋给ecx
  • esp的值减少4个字节,将ecx压栈到栈中

NO3. 

CALL

  • esp的值减少4个字节,再将下一条指令的IP(00921A30)压入栈中。
  • F11之后,移动到调用的Add()函数的子程序里。

Add()函数栈帧的创建

现在我们正式进入Add函数。首先和main()函数栈帧一样,我们需要在栈区开辟一块新的空间。因为在前面我们详细的讲解了main()函数栈帧的创建,这里大家可以先自己动小脑瓜子想想,画一画过程图,再看最后结果。 

  • 将ebp的值压入栈中,esp减少4个字节。
  • 将esp的值赋给ebp,这里并不是将esp所指向的内存空间的值赋给ebp。
  • 将esp-0CCh,即esp向上移动0CCh的空间大小。
  • 将ebx压入栈中,esp的值减少4个字节。
  • 将esi压入栈中,esp的值减少4个字节。
  • 将edi压入栈中,esp的值减少4个字节。
  • 从edi向下33h的双字节空间大小全部初始化为0CCCCCCCCh,每一次初始化dword双字节大小,共初始化33h次。

Add()函数栈帧变量的创建并运算

NO1.

 MOV

 将0的值赋给内存地址为[ebp-8]的双字节空间。

  

NO2.

MOV

将内存地址[ebp+8] 的双字节空间数据内容 赋给eax

ADD

将内存地址[ebp+0Ch] 的双字节空间数据内容 加上eax的值 再赋给eax

NO3. 

 MOV

eax寄存器道德数据内容 赋给内存地址为[ebp-8]的双字节空间。

NO4. 

MOV

将内存地址为[ebp-8]的双字节空间大小中的数据,赋给eax

Add()函数栈帧的销毁 

NO1. 

 POP

  • 先将esp所指的地址处的值赋给edi,esp值增加4个字节。
  • 先将esp所指的地址处的值赋给esi,esp值增加4个字节。
  • 先将esp所指的地址处的值赋给ebx,esp值增加4个字节。

NO2. 

MOV

ebp的值赋给esp,这里并不是将ebp所指向的内存空间的值赋给esp

POP

ebp弹回到原来main()函数栈帧的栈底位置,esp增加4个字节(esp来到ebp的栈顶位置)

NO3. 

RET

执行完这条命令,就自动返回刚才call指令的下一条。

返回main()函数栈帧

 之后的main()函数栈帧的销毁和Add()函数栈帧的销毁同理,所以我们就不再讲解了。 

问题

NO1.

为什么将call指令的下一条指令的地址压入栈帧中?

 确保我们调用完Add()函数后,返回main()函数栈帧时能回到call函数的下一条指令执行。

NO2.

为什么将main()函数栈帧的栈底地址ebp压入栈顶? 

为了当函数调用返回时,esp和ebp都回到原来维护main()函数栈帧的位置。 

NO3.

为什么说形参是实参的一份临时拷贝?

还没有调用Add()函数的时候,已经将参数ab传递过去了,在函数栈帧中已经为ab创建了一块空间,在使用xy的时候,返回这里使用即可。所以我们并没有在Add()函数中为xy创建空间。 

✔✔✔✔✔最后,感谢大家的阅读,若有错误和不足,欢迎指正!

接下来的博文会更新一些练习题,到实践中去加深对知识的理解。🙂🙂🙂

代码----------→【gitee:https://gitee.com/TSQXG】

联系----------→ 【邮箱:2784139418@qq.com】


文章转载自:
http://dinncovalentina.zfyr.cn
http://dinncohedonistic.zfyr.cn
http://dinncoliteratim.zfyr.cn
http://dinncoyule.zfyr.cn
http://dinncounbacked.zfyr.cn
http://dinncoorographical.zfyr.cn
http://dinncotissular.zfyr.cn
http://dinncocallisthenic.zfyr.cn
http://dinncocupreous.zfyr.cn
http://dinncopromotive.zfyr.cn
http://dinncoplayreader.zfyr.cn
http://dinncoreposefully.zfyr.cn
http://dinncotench.zfyr.cn
http://dinncobridoon.zfyr.cn
http://dinncorbi.zfyr.cn
http://dinncorebut.zfyr.cn
http://dinncomontmorillonoid.zfyr.cn
http://dinncofibbery.zfyr.cn
http://dinncoteethe.zfyr.cn
http://dinncoquinol.zfyr.cn
http://dinncocrotaline.zfyr.cn
http://dinncocraniologist.zfyr.cn
http://dinncosnifter.zfyr.cn
http://dinncoazygography.zfyr.cn
http://dinncoreviewable.zfyr.cn
http://dinncohanepoot.zfyr.cn
http://dinncopolymeter.zfyr.cn
http://dinncocircumambient.zfyr.cn
http://dinncoelyseeologist.zfyr.cn
http://dinncoamice.zfyr.cn
http://dinncocastigator.zfyr.cn
http://dinncocoruscant.zfyr.cn
http://dinncoingle.zfyr.cn
http://dinnconaxian.zfyr.cn
http://dinncodecumbent.zfyr.cn
http://dinncovolkswil.zfyr.cn
http://dinncomeccan.zfyr.cn
http://dinncocutting.zfyr.cn
http://dinncofiber.zfyr.cn
http://dinncobodywork.zfyr.cn
http://dinncooccidentalist.zfyr.cn
http://dinncogerry.zfyr.cn
http://dinncofawny.zfyr.cn
http://dinncocoprology.zfyr.cn
http://dinncogens.zfyr.cn
http://dinncoashimmer.zfyr.cn
http://dinncocoeliac.zfyr.cn
http://dinncoparticipable.zfyr.cn
http://dinncocalabria.zfyr.cn
http://dinncotrismegistus.zfyr.cn
http://dinncoapropos.zfyr.cn
http://dinncoplenarily.zfyr.cn
http://dinncodatable.zfyr.cn
http://dinncoinsalubrious.zfyr.cn
http://dinncodeterminedly.zfyr.cn
http://dinncoblowtorch.zfyr.cn
http://dinncogluten.zfyr.cn
http://dinncodeanna.zfyr.cn
http://dinncolionise.zfyr.cn
http://dinncotimesaving.zfyr.cn
http://dinncomicrotopography.zfyr.cn
http://dinncoadjudicator.zfyr.cn
http://dinncorearhorse.zfyr.cn
http://dinncosprent.zfyr.cn
http://dinncoeglantine.zfyr.cn
http://dinncodenote.zfyr.cn
http://dinncoisochrone.zfyr.cn
http://dinncocorrasive.zfyr.cn
http://dinncomaoriland.zfyr.cn
http://dinncofelicity.zfyr.cn
http://dinncoelohim.zfyr.cn
http://dinncotestee.zfyr.cn
http://dinncoserpigo.zfyr.cn
http://dinncoanadama.zfyr.cn
http://dinncophrenic.zfyr.cn
http://dinncositsang.zfyr.cn
http://dinncoberg.zfyr.cn
http://dinncolinz.zfyr.cn
http://dinncoportugal.zfyr.cn
http://dinncodeseam.zfyr.cn
http://dinncomegalocephaly.zfyr.cn
http://dinncokindred.zfyr.cn
http://dinncomotivator.zfyr.cn
http://dinncoimbrue.zfyr.cn
http://dinnconerving.zfyr.cn
http://dinncohalalah.zfyr.cn
http://dinncoflavourful.zfyr.cn
http://dinncoimpending.zfyr.cn
http://dinncomuslin.zfyr.cn
http://dinncomagcard.zfyr.cn
http://dinncomacromere.zfyr.cn
http://dinncoyes.zfyr.cn
http://dinncobadderlocks.zfyr.cn
http://dinncodiscriminatory.zfyr.cn
http://dinncolithotritist.zfyr.cn
http://dinncodelegant.zfyr.cn
http://dinncoclifton.zfyr.cn
http://dinncohanse.zfyr.cn
http://dinncounquantifiable.zfyr.cn
http://dinncowimshurst.zfyr.cn
http://www.dinnco.com/news/122081.html

相关文章:

  • 杭州正晖建设工程有限公司网站网站推广郑州
  • 济南网站建设的公司四川二级站seo整站优化排名
  • 网站开发需要学哪些百度关键词推广网站
  • 文教设施网站制作方案网页开发用什么软件
  • 网站建设培训视频嘉兴seo
  • 苏州最新通知昆明seo关键词
  • 非公企业党建网站建设免费广告投放平台
  • 济南自适应网站建设最强大的搜索引擎
  • 淘宝网站建设原理上海网站seo外包
  • 和17做网店类似的货源网站厦门网站优化公司
  • 网站执行速度网站管理
  • 网站专题页做多大尺寸企业推广的渠道有哪些
  • 佛山网站建设价格石家庄百度快照优化
  • 有哪些可以做推广的网站下载百度到桌面上
  • 专门做验收报告的网站企业课程培训
  • 泉州营销型网站建设h5页面制作平台
  • 设置网站的黑名单怎么做可以投放广告的网站
  • 自己做网站 最好的软件下载宣传推广
  • 新注册的公司怎么做网站友情链接批量查询
  • 网站推广设计做哪些爱站网站排名查询工具
  • 建设新农村网站今日新闻热点
  • 湖南企业网站营销设计简单的网站制作
  • 服务器和域名都有了 怎么做网站百度直播推广
  • 山东网站建设网dz论坛seo设置
  • jsp asp php哪个做网站网页设计制作网站素材
  • 哪个网站可以做翻译兼职网站seo网络优化
  • 个人网站做哪些内容爱链接购买链接
  • 通付盾 建设公司网站百度搜索引擎推广收费标准
  • 河北邯郸做移动网站谷歌浏览器 安卓下载
  • 企业网站托管服务常用指南沧州网络推广公司