函数栈
下图是x86-64的函数栈的结构, 函数P调用函数Q的过程,Q正在执行。
这里仅对两个地方解释,其他的很容易理解,就不细说了
- 其中返回地址用来实现函数的返回。当Q要返回到P时,就要调用此地址获取返回位置。
- 参数构造区是对调用函数P传递的参数的拷贝,因为当P传递参数过多时,无法通过寄存器传递,只好在P的栈帧中保存;调用Q时,将其拷贝到参数构造区
x86-64过程只分配自己所需要的栈帧部分,许多函数甚至根本不需要栈帧。
控制转移
指令 | 描述 |
---|---|
call Label | 过程调用 |
call *Operand | 过程调用 |
ret | 从过程调用中返回 |
数据对齐
许多计算机系统对基本的数据类型的合法地址做出了一些限制,要求某种类型对象的地址必须是某个值K(通常是2、4或8)的倍数。一是为了读取效率,二是某些硬件设备要求。