函数调用中堆栈的个人理解

    xiaoxiao2021-04-16  227

    这是我的第一篇博客,由于公司项目需要,将暂时告别C语言一段时间。所以在此记录一下自己之前学习C语言的一些心得体会,希望可以分享给大家,也可以记录下自己学习过程中遇到的问题以及存在的疑惑(其实就是自己学习过程中不解的地方)。好了,废话不多说,开始微博内容了,O(∩_∩)O哈哈~

        接下来将通过下面几个问题解析函数调用中对堆栈理解:

    函数调用过程中堆栈在内存中存放的结构如何?汇编语言中call,ret,leave等具体操作时如何?linux中任务的堆栈,数据存放是如何?

        1. 函数调用过程中堆栈在内存中存放的结构如何?

        计算机,嵌入式设备,智能设备等其实都是有软件和硬件两部分组成,具体实现也许复杂,但整体的结构也就如此。软件运行在硬件上,告诉硬件该干什么。操作系统软件是在启动过程中经过BIOS,bootloarder等(如果有这些过程的话)从磁盘加载到内存中,而自定义软件则是编写存放到磁盘中,只有通过加载才会到内存中运行。

        首先我们来看一下什么是堆、栈还有堆栈,我们经常说堆栈其实它是等同于栈的概念。

        可以通俗意义上这样理解堆,堆是一段非常大的内存空间,供不同的程序员从其中取出一段供自己使用,使用之后要由程序员自己释放,如果不释放的话,这部分存储空间将不能被其他程序使用。堆的存储空间是不连续的,因为会因为不同时间,不同大小的堆空间的申请导致其不连续性。堆的生长是从低地址向高地址增长的。

        对栈的理解是,栈是一段存储空间,供系统或者操作系统使用,对程序员来说一般是不可见的,除非从一开始由程序员自己通过汇编等自己构建栈,栈会由系统管理单元自己申请释放。栈是从高地址向低地址生长的,既栈底在高地址,栈顶低地址。

        其次我们看一下应用程序的加载,应用程序被加载进内存后,由操作系统为其分配堆栈,程序的入口函数会是main函数。不过main函数也不是第一个被调用的函数,我们通过简单的例子讲解。

    #include <stdio.h> #include <string.h> int function(int arg) { return arg; } int main(void) { int i = 10; int j; j = function(i); printf("%d\n",j); return 0; }

    用gcc -S main.c 生成汇编文件main.s, 其中function的汇编代码如下:

    function: .LFB0: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 movl
    转载请注明原文地址: https://yun.8miu.com/read-1284.html

    最新回复(0)