函数调用的汇编语言详解

本文详细解析了函数调用的汇编语言实现,涵盖了栈的概念、栈帧的形成以及寄存器的保存过程。通过阐述栈的生长方向、栈帧的范围以及在函数调用中如何保存和恢复寄存器状态,揭示了函数调用的大体流程。内容包括函数参数的传递、返回地址的保存以及栈帧的建立和销毁等关键环节。
摘要由CSDN通过智能技术生成

一、基本概念

想要彻底的理解函数调用过程,先要明白一下几个概念。

1、栈

这里说的栈不是数据结构中的栈,而是计算机内存中的一块存储区,它的访问方式是“先进后出”。大多数情况下,栈是从高地址向低地址增长的。

栈有很多单元格,通常情况下每个单元格是8位的(即可以存8个0或1),称为数据宽度,是用来存放数据的。每个单元格都会对应一个地址,地址一般是无符号32位的整数,因此可以表示4294967295(32位无符号整数可以表示的最大值)个单元格。

关于栈的操作涉及到两个寄存器,即ESP和EBP(什么是寄存器这里就不多说了),另外还有两个指令,POP和PUSH。

首先说一下两个寄存器,这两个寄存器分别称为栈指针寄存器和基址指针寄存器,因此这两个寄存器中存的是指针,即地址(这个地址就是前面说到的单元格对应的地址),更确切的说应该是栈帧顶部的地址(ESP)和栈帧底部的地址(EBP)(栈帧是什么后面会讲到)。

下面是一个栈的结构图:


可以看到,栈是从高地址向低地址增长的,高地址对应栈底,低地址对应栈顶,每个存放数据的单元格都有一个对应的地址,每个单元格的宽度为8位。

下面说一下POP和PUSH指令,这两个指令都只能操作栈顶,PUSH是向栈中推入一个数放在栈顶,POP是将栈顶的数据弹出。

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值