1. 概述
本文总结了一些汇编相关的基础知识。
2. 详述
2.1. 基础知识
- 帧指针(FP,frame pointer)寄存器,其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的底部。
 - 栈指针(SP,stack pointer)寄存器,其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的栈顶。
 - 基指针(BP,base pointer)寄存器,其内存中存放着一个指针,该指针指向当前栈帧的底部。
 - 函数栈帧:SP和BP之间的内存空间为当前栈帧,BP标识了当前栈帧的底部,SP标识了当前栈帧的顶部。
 - 指令指针(IP,instruction pointer)寄存器, 其内存放着一个指针,该指针永远指向下一条待执行的指令地址。
 
2.2. 函数调用的步骤
- 参数入栈:将参数从右向左依次压入系统栈中
 - 返回地址入栈:将当前代码区调用指令的下一条指令地址压入栈中,供函数返回时继续执行
 - 代码区跳转:处理器从当前代码区跳转到被调用函数的入口处
 - 栈帧调整:具体包括:(1)保存当前栈帧状态值,以备后面恢复本栈帧时使用(EBP入栈)。(2)将当前栈帧切换到新栈帧(将ESP值装入EBP,更新栈帧底部)。(3)给新栈帧分配空间(把ESP减去所需空间的大小,抬高栈顶)。
 
以如下的C语言程序为例,看一下汇编语言中的过程。C语言代码如下:
1  | #include <stdio.h>  | 
汇编代码如下:
1  | 0000000000000000 <func>:  |