函数的调用堆栈

本文介绍了C++中函数调用的过程,包括函数栈帧的开辟和回退。通过一个简单的例子,展示了参数如何压栈,以及call指令的工作原理。在被调用方,ebp压栈并开辟内存,初始化栈帧,而清栈时则通过ebp恢复调用方的栈底状态。
摘要由CSDN通过智能技术生成

在学习c++的过程中,有面向过程和面向对象两种编程方式。对于面向过程来说,函数的书写是最基本的,所以了解函数的调用过程和函数调用的底层原理也是必须要会的事情。

那么函数栈帧的开辟和回退是怎么进行的呢?

下面我们先用一个简单的例子,通过一个模拟模型和反汇编来了解一下函数堆栈的调用。

 

题外话:

 

1、说到汇编我们要知道,汇编的代码分为两种:

一种是inter的x86汇编(从右向左看),

一种是Unix上的AT&T汇编(从左向右看)

 

2、栈上的两个指针:在栈上开辟内存后,在栈上访问变量和数据都是通过访问ebp指针的偏移量来实现。一个栈用两个指针来表示,其中ebp为栈底指针,esp为栈顶指针。从下往上看,栈底是高地址,栈顶是低地址。

 

3、在看反汇编的代码之前先介绍几个指令的含义

  (1)mov 是用来移动值的,将值压栈

之前我们已经介绍过,在x86系统上反汇编的代码要从右向左看,下面我们用一个小例子来简单解释一下,之后就不再过多赘述了。

例如:

mov   dword  ptr[ebp-4]  0Ah    

注:dword意思是double  word 一个字表示2个字节,所以dword表示4个字节

这个语句的意思是将  OAh(立即数10) 移动到 ebp-4 这个地址表示的4个字节的内存中

  (2)lea 是用来将指针压栈的<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值