首页 > 其他分享 >10.8 函数内部的处理

10.8 函数内部的处理

时间:2023-02-14 22:35:56浏览次数:46  
标签:10 函数 状态 10.8 eax ebp 寄存器 内部

通过执行AddNum函数的源代码部分,来看一下参数的接收、返回值的返回等机制(代码清单10-5)。

 ebp寄存器的值在(1)中入栈,在(5)中出栈。这主要是为了把函数中用到的ebp寄存器的内容,恢复到函数调用前的状态。在进入函数处理之前,无法确定ebp寄存器用到了什么地方,但由于函数内部也会用到ebp寄存器,所以就暂时将该值保存了起来。CPU拥有的寄存器是有数量限制的。在函数调用前,调用源有可能已经在使用ebp寄存器了。因而,在函数内部利用的寄存器,要尽量返回到函数调用前的状态。为此,我们就需要将其暂时保存在栈中,然后再在函数处理完毕之前出栈,使其返回到原来的状态。

(2)中把负责管理栈地址的esp寄存器的值赋值到了ebp寄存器中。这是因为,在mov指令中方括号内的参数,是不允许指定esp寄存器的。因此,这里就采用了不直接通过esp,而是用ebp寄存器来读写栈内容的方法。
(3)是用[ebp+8]指定栈中存储的第1个参数123,并将其读出到eax寄存器中。像这样,不使用pop指令,也可以参照栈的内容。而之所以从多个寄存器中选择了eax寄存器,是因为eax寄存器是负责运算的累加寄存器。
通过(4)的add指令,把当前eax寄存器的值同第2个参数相加后的结果存储在eax寄存器中。[ebp+12]是用来指定第2个参数456的。在C语言中,函数的返回值必须通过eax寄存器返回,不过,和ebp寄存器不同的是,eax寄存器的值不用还原到原始状态。

“函数的参数是通过栈来传递,返回值是通过寄存器来返回的”
(6)中ret指令运行后,函数返回目的地的内存地址会自动出栈,据此,程序流程就会跳转返回到代码清单10-4的(6)(Call_AddNum的下一行)。这时,AddNum函数入口和出口处栈的状态变化,就如图10-5所示。将图10-4和图10-5按照(a)(b)(c)(d)(e)(f)的顺序来看的话,函数调用处理时栈的状态变化就会很清楚了。由于(a)状态时处理跳转到AddNum函数,因此(a)和(b)是同样的。同理,在(d)状态时,处理跳转到了调用源,因此(d)和(e)是同样的。在(f)状态时则进行了清理处理。栈的最高位的数据地址,是一直存储在esp寄存器中的。

标签:10,函数,状态,10.8,eax,ebp,寄存器,内部
From: https://www.cnblogs.com/ttmeng/p/17121081.html

相关文章

  • STM32定时器TIM_OC1PreloadConfig、TIM_ARRPreloadConfig函数详解
    ———————————————————————————————————————————版权声明:本文为CSDN博主「qlexcel」的原创文章,遵循CC4.0BY-SA版权协议,转载请......
  • 10.7 函数调用机制
     代码清单10-1中列出的C语言源代码中,有一个处理是在变量c中存储AddNum函数的返回值,不过在汇编语言的源代码中,并没有与此对应的处理。这是因为编译器有最优化功能。最......
  • 函数的扩展
    箭头函数基本用法varf=v=>v;//等同于varf=function(v){returnv;};如果箭头函数不需要参数或需要多个参数,就使用一个圆括号代表参数部分varf=(......
  • python 魔法函数学习
    1.什么是魔法函数  以__开始和结束,不需要专门调用,在特定场合下,python会自己调用,如__init__,__str__等2.常用的魔法函数  __str__: 返回类对象友好的提示,例子class......
  • VUE简介/插值/属性/文本/函数指令/if/for操作
    VUE简介/插值/属性/文本/函数指令前端发展史1.前后端一体的,HTML(5)、CSS(3)、JavaScript(ES5、ES6):编写一个个的页面->给后端(PHP、Python、Go、Java)->后端嵌入模板......
  • sql语气查询去重的两种方法、sql的模糊查询、sql中的日期函数、mysql字符串截取之subs
    sql语气查询去重的两种方法以下两种都可以进行去重查询,区别是:用distinct去重,只能查询到去重的属性那一列,无法查询其他字段用groupby分组查询,可以根据需求查询对应的其......
  • 10.8函数内部的处理
         ebp寄存器的值在(1)中人栈,在(5)中出栈。这主要是为了把函数中用到的ebp寄存器的内容,恢复到函数调用前的状态。在进入函数处理之前,无法确定ebp寄存器用......
  • 10.7函数调用机制
          代码清单10-1中列出的C语言源代码中,有一个处理是在变量c中存储AddNum函数的返回值,不过在汇编语言的源代码中,并没有与此对应的处理。这是因为编译器有......
  • Java内部类
    Java内部类内部类介绍在java中,可以将一个类定义到另一个类的内部或者方法内部,这样的类叫做内部类,内部类可以分为:成员内部类、局部内部类、匿名内部类、静态内部类。1.......
  • 单链表:清空、销毁、求单链表结点个数、判空函数
    一、单链表结构定义typedefvoid(myOpFunType)(void*); ///<定义操作函数类型typedefintlinkType; ///<定义链表结点数据域数据类型///@brief链表结点定义t......