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

10.8函数内部的处理

时间:2023-02-08 09:47:42浏览次数:31  
标签: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/2674308160-lucky/p/17100561.html

相关文章

  • 10.7函数调用机制
     上面这个图是函数调用的汇编语言代码:  (1)、(2)、(7)、(8)的处理适用于C语言中所有的函数,我们会在后面展示AddNum函数处理内容时进行说明。这里希望大家先关注一下......
  • 第10课、python 函数、类和方法
      -----------------一、数学相关1、绝对值:abs(-1)2、最大最小值:max([1,2,3])、min([1,2,3])3、序列长度:len('abc')、len([1,2,3])、len((1,2,3))4、取模:divmod(5,2......
  • 字符串与内存函数(1)
    本篇文章和大家分享一些处理字符和字符串的函数,以及一些内存操作函数。大致有以下几个函数:strlen函数, strcpy函数, strcat函数, strcmp函数,strncpy函数,strncat......
  • 区分构造函数、拷贝构造函数和赋值函数
    对象不存在,且没用别的对象来初始化它,那么调用构造函数对象不存在,且用别的对象来初始化它,那么调用拷贝构造函数(调用拷贝构造函数来初始化几种情况)1.一个对象以值传递的方......
  • 默认构造函数是什么
    默认构造函数是:在不提供任何构造函数的前提下,编译器生成的一个没有参数,没有内容的构造函数Aa;调用的是无参构造函数。如果存在其他构造函数,编译器不会自动生成默认构造......
  • 凸函数
    https://zhuanlan.zhihu.com/p/87485105https://proofwiki.org/wiki/Inverse_of_Strictly_Increasing_Convex_Real_Function_is_Concave......
  • 10.8函数内部的处理
    接下来,让我们透过执行AddNum函数的源代码部分,来看一下参数的接收、返回值的返回等机制(代码清单10-5)。  ebp寄存器的值在(1)中人栈,在(5)中出栈。这主要是为了把......
  • 【C语言】文件操作函数代码示例。
    ......
  • m对比PSO,WPA,GWPA以及GWO四种优化算法的优化性能,优化目标函数为10个来自CEC2017的标
    1.算法描述        灰狼优化算法(GWO),灵感来自于灰狼.GWO算法模拟了自然界灰狼的领导层级和狩猎机制.四种类型的灰狼,如α,β,δ,w被用来模拟领导阶层。此外,还......
  • AQS 中的 ConditionObject 内部类
    AQS中的ConditionObject内部类ConditionObject内部类主要用作条件等待队列,条件等待队列为单项链表加入条件队列的过程:等待队列的节点调用await()从同步队列移......