首页 > 其他分享 >10.7函数调用机制

10.7函数调用机制

时间:2023-02-08 09:34:35浏览次数:51  
标签:10 函数 10.7 代码 AddNum 函数调用 C语言 机制

 

上面这个图是函数调用的汇编语言代码:

 

 (1)、(2)、(7)、(8)的处理适用于C语言中所有的函数,我们会在后面展示AddNum函数处理内容时进行说明。这里希望大家先关注一下(3)~(6)部分,这对了解函数调用的机制至关重要。

(3)和(4)表示的是将传递给AddNum函数的参数通过push入栈。在C语言的源代码中,虽然记述为函数AddNum(123,456),但1 在函数的入口处把寄存器ebp的值入栈保存(代码清单10-4(1)),在函数的出口处出栈(代码清单10-4(7)),这是C语言编译器的规定。这样做是为了确保函数调用前后ebp寄存器的值不发生变化。入栈时则会按照456、123这样的顺序,也就是位于后面的数值先入栈。这是C语言的规定。

(5)的call指令,把程序流程跳转到了操作数中指定的AddNum函数所在的内存地址处。在汇编语言中,函数名表示的是函数所在的内存地址。AddNum函数处理完毕后,程序流程必须要返回到编号(6)这一行。call指令运行后,call指令的下一行((6)这一行)的内存地址(调用函数完毕后要返回的内存地址)会自动地push入栈。该值会在AddNum函数处理的最后通过ret指令pop出栈,然后程序流程就会返回到(6)这一行。
(6)部分会把栈中存储的两个参数(456和123)进行销毁处理,也就是在第5章提到的栈清理处理。虽然通过使用两次pop指令也可以实现,不过采用esp寄存器加8的方式会更有效率(处理1次即可)。对栈进行数值的输入输出时,数值的单位是4字节。因此,通过在负责栈地址管理的esp寄存器中加上4的2倍8,就可以达到和运行两次pop命令同样的效果。虽然内存中的数据实际上还残留着,但只要把esp寄存器的值更新为数据存储地址前面的数据位置,该数据也就相当于被销毁了。
代码清单10-1中列出的C语言源代码中,有一个处理是在变量c中存储AddNum函数的返回值,不过在汇编语言的源代码中,并没有与此对应的处理。这是因为编译器有最优化功能。最优化功能是编译器在本地代码上费尽功夫实现的,其目的是让编译后的程序运行速度更快、文件更小。在代码清单10-1中,由于存储着AddNum函数返回值的变量c在后面没有被用到,因此编译器就会认为“该处理没有意义”,进而也就没有生成与之对应的汇编语言代码。在编译代码清单
10-1的代码时,应该会出现“警告W8004 Sample4.c 11:'c'的赋值未被使用(函数MyFunc)”这样的警告消息。

 

标签:10,函数,10.7,代码,AddNum,函数调用,C语言,机制
From: https://www.cnblogs.com/2674308160-lucky/p/17100548.html

相关文章

  • 11.7文字及图片的显示机制
    在本章的最后,让我们一起来看一下显示器显示文字及图形的机制。如果用一句话来简单地概括该机制,那就是显示器中显示的信息一直存储在某内存中。该内存称为VRAM(VideoRAM)......
  • 包机制和JavaDoc
    包机制和JavaDoc包机制为了更好地组织类,Java提供了包机制,用于区别类名的命名空间。包本质就是一个文件夹。一般利用公司域名倒置作为包名。定义包用package,......
  • 通过mongo-driver使用说明 GO 包管理机制
    本篇记录通过GO语言操作mongodb,实现的流程包括:初始化项目工程容器方式安装mongo调试运行和编译运行go使用mongo的代码如下,go操作mongo的SDK是mongo-driver,一个第三......
  • RPC框架的健康检测机制
    服务发现的作用:实时感知集群IP的变化,实现接口跟服务集群节点IP的映射。超大规模集群更要考虑最终一致性。“推拉结合,以拉为准”。1健康检测因为有了集群,所以每次发请求前,RP......
  • 包机制
    包机制语法格式:package文件夹1[.文件夹2[.文件夹3...]];packagetest.operator;一般使用公司域名倒置作为包名,如:com.baidu.www导入包:import包名;//导入test.operat......
  • Java序列化机制要序列化那些内容
    在javaeye上搜到一篇robbin关于java序列化的回复,我觉得其中的例子很有说服力,转过来和大家分享。关于更多java序列化的问题可以参见JAVA系列之对象的......
  • 数据库并发控制机制的理解
    隔离级别相当于数据库实现的一套现有的机制,我们直接可以复用;但对于特殊需求,我们可以自己使用锁机制来实现,其实我们自己就可以使用锁机制,实现一套隔离级别;锁机制只是隔......
  • JVM垃圾回收机制,万字详解
    JVM垃圾回收机制jvm的基本组成虚拟机的组成所谓java能实现跨平台,是因为在不同平台上运行不同的虚拟机决定的,因此java文件的执行不直接在操作系统上执行,而是通过jvm虚拟机执......
  • 【Java AWT 图形界面编程】事件处理机制 ③ ( AWT 中常见的事件和事件监听器 | 低级事
    文章目录​​一、AWT中常见的事件​​​​1、低级事件​​​​2、高级事件​​​​二、AWT中常见的事件监听器​​一、AWT中常见的事件AWT中事件分为两大类,低级事件......
  • 浅析MySql中的MVCC机制
    前言本文将分析mvcc的机制和工作原理并举例说明。话不多说,直入主题MVCC机制是什么MVCC,英文全称MultiversionConcurrencyControl,多版本并发控制。简单理解,就是相当于给......