在学习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 是用来将指针压栈的<