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>: |