20242828-第二周作业-从汇编视角解析函数调用中的堆栈运作

从汇编视角解析函数调用中的堆栈运作

1.引言

汇编语言是计算机硬件操作的最直接表达方式,通过汇编代码可以深入理解计算机底层的工作机制。本文将以一个简单的C语言代码为例,深入分析其对应的汇编代码中的堆栈变化,探讨计算机在执行过程中如何通过堆栈来进行函数调用、参数传递和结果返回。

2.C语言代码与汇编代码准备

在Linux终端使用gedit命令编辑main.c文件(如果没有该文件会自动创建)
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

代码内容如下

#include<stdio.h>

int g(int x)
{
    return x + 2024;
}
    
int f(int x)
{
    return g(x);
}
    
int main(void)
{
    return f(2024) + 1;
}

使用gcc命令编译C文件

gcc –S –o main.s main.c -m32

这行Linux系统中的命令是用来编译C语言的源代码文件。具体来说,这条命令的作用如下:

  • gcc:这是GNU编译器集合(GNU Compiler Collection)中的GNU C编译器。
  • –S:这个选项告诉gcc编译器只进行编译的第一步,也就是将C语言源代码转换成汇编语言代码,但不进行汇编和链接。
  • –o main.s:这个选项指定了输出文件的名字,即汇编语言文件的名称为main.s
  • main.c:这是输入文件,也就是要编译的C语言源文件。
  • -m32:这个选项指示编译器生成适用于32位系统的代码。这在64位系统上编译32位程序时很有用。
    所以,这行命令的整体作用是将名为main.c的C语言源文件编译成名为main.s的汇编语言文件,并且生成的汇编代码是为32位系统设计的。如果你执行这条命令,你会得到一个包含汇编指令的文件,而不是直接得到可执行文件。
    在这里插入图片描述

在这里插入图片描述

  • pushl %ebp:将当前ebp压入堆栈,保存上一层的基址指针,以便稍后恢复。

    • 堆栈内容:[旧ebp]
  • movl %esp, %ebp:将当前的栈顶指针esp赋值给ebp,建立新的栈帧。

    • 堆栈内容:[旧ebp],此时ebpesp指向同一位置。
  • pushl $2024:将常数2024压入堆栈,作为传递给f函数的参数。

    • 堆栈内容:[旧ebp] [2024]
  • call f:调用f函数,程序跳转至f函数的入口地址。此时返回地址被压入堆栈,以便在f函数执行完后能够返回到main函数的下一条指令。

    • 堆栈内容:[旧ebp] [2024] [返回地址]

在这里插入图片描述

  • pushl %ebp:保存上一层的基址指针。

    • 堆栈内容:[旧ebp] [2024] [返回地址] [旧ebp]
  • movl %esp, %ebp:建立新的栈帧。

    • 堆栈内容:[旧ebp] [2024] [返回地址] [旧ebp]ebpesp指向最后一个旧ebp
  • pushl 8(%ebp):将main函数中传递给f的参数(即2024)压入堆栈,作为传递给g函数的参数。

    • 堆栈内容:[旧ebp] [2024] [返回地址] [旧ebp] [2024]
  • call g:调用g函数,返回地址被压入堆栈。

    • 堆栈内容:[旧ebp] [2024] [返回地址] [旧ebp] [2024] [返回地址]

在这里插入图片描述

  • pushl %ebp:保存上一层的基址指针。

    • 堆栈内容:[旧ebp] [2024] [返回地址] [旧ebp] [2024] [返回地址] [旧ebp]
  • movl %esp, %ebp:建立新的栈帧。

    • 堆栈内容:[旧ebp] [2024] [返回地址] [旧ebp] [2024] [返回地址] [旧ebp]
  • movl 8(%ebp), %eax:从栈中取出2024并放入eax寄存器。

  • addl $2024, %eax:将2024加到eax寄存器中,结果为2024 + 2024 = 4048

  • popl %ebp:恢复上一层的基址指针。

  • ret:从栈中弹出返回地址,并跳转回到f函数中继续执行。

3. 总结:计算机是如何工作的

通过对汇编代码的深入分析,我们可以看到,堆栈在函数调用过程中起到了关键的作用。每当发生函数调用时,堆栈会保存当前函数的执行状态(如基址指针ebp和返回地址),并为被调用函数分配空间。函数调用结束后,通过恢复堆栈中的数据,程序能够准确地回到上一次的执行状态。

堆栈不仅用于函数调用和返回,它还用于参数传递和局部变量的存储。计算机的工作可以被理解为:通过指令和堆栈的相互作用来管理程序的执行流程,确保不同函数之间的信息能够无缝地传递和恢复。

总结来说,计算机的工作原理是通过CPU执行一条条指令,同时通过寄存器和堆栈维护程序的状态。堆栈在这一过程中扮演了“信息中转站”的角色,确保程序能够正确且有序地执行各个函数及其关联操作。
和恢复。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值