首页 > 程序开发 > 软件开发 > 其他 >

程序开发栈帧问题解析

2018-04-11

程序开发栈帧问题解析,栈帧(stack frame)也叫过程活动记录,是编译器用来实现过程 函数调用的一种数据结构。C语言中,每个栈帧对应着一个未运行完的函数。栈帧中保存了该函数的返回地址和局部变量。

栈帧(stack frame)也叫过程活动记录,是编译器用来实现过程/函数调用的一种数据结构。C语言中,每个栈帧对应着一个未运行完的函数。栈帧中保存了该函数的返回地址和局部变量。

机器用栈来传递过程参数,存储返回信息,保存寄存器用于以后恢复,以及本地存储。为单个过程(函数调用)分配的那部分栈称为栈帧。栈帧其实是两个指针寄存器,寄存器%ebp为帧指针,而寄存器%esp为栈指针,当程序运行时,栈指针可以移动(大多数的信息的访问都是通过帧指针的)。栈是从高地址向低地址延伸的。每个函数的每次调用,都有它自己独立的一个栈帧,这个栈帧中维持着所需要的各种信息。寄存器ebp指向当前的栈帧的底部(高地址),寄存器esp指向当前的栈帧的顶部(低地址)。总之简单一句话,栈帧的主要作用是用来控制和保存一个过程的所有信息的。

注意:EBP指向当前位于系统栈最上边一个栈帧的底部,而不是系统栈的底部。

寄存器ebp指向当前的栈帧的底部(高地址)。

寄存器esp指向当前的栈帧的顶部(地址地)。

PC指针:永远指向当前运行程序指令的下一条指令。

栈帧结构如下所示:
》


大小端问题:

(1)大小端是不同的对于数据在内存地址中的存放方式,不同的处理器(平台)的数据存储方式是不同。但如果实现跨平台通信则大小端是不能忽视的问题。大端模式:数据的高位存储在内存的低字节。ARM/PowerPC等处理器采用大端模式小端模式:数据的地位存储在内存的低字节。Intel架构处理器采用小端模式。如一个数据:0x12345678;对应内纯地址是0x00~0x03。

模式 地址 数据
大端模式 0x00 0x01 0x02 0x03 0x12 0x34 0x56 0x78
小端模式 0x000x01 0x02 0x03 0x780x56 0x34 0x122

(2)字节序对应着内存的存储(组织)模式,如网络字节序采用大端模式。
(3)字节序只是对内置的数据类型而言(int、short、double、long….char)而对于char而言由于其本身只有一个字节则字节序和存储模式对其不影响。(因此字符串在跨平台传输时不用考虑字节序)
(4)单字节内纯中的比特为不受字节序的影响,大于1个字节的数据类型,字节序才对其有影响。

相关文章
最新文章
热点推荐