C 语言,全部函数的调用,是通过栈来实现的,当函数被调用时,其返回地址、参数以及局部变量会被压入栈中。当函数返回时,这些信息会从栈中弹出,以规复到函数被调用之前的状态。我们可以称维护全部函数调用形成的这个栈空间为函数调用栈。
特殊要留意的是,一个 C 程序的栈是往下生长的,即栈底在高地址,栈顶在低地址,入栈,栈顶地址会变小,出栈,栈顶地址会变大。
3.4 函数栈帧
在 C 语言中,从一个函数的进入,到这个函数返回,形成的栈空间,我们称为函数栈帧。函数栈帧不是固定不变的,而是随着函数的功能,栈帧空间大概随时在变大或缩小。
3.5 相关寄存器
ebp: extended base pointer,扩展基址指针寄存器,一样平常用于当进入一个函数时,存放该函数的栈帧基址(栈帧的栈底)。
esp: extended stack pointer,扩展栈指针寄存器,存放函数栈的栈顶
ebp 和 esp 配合使用,共同协作维护着正在运行的函数的栈帧
ebx: extended base register,扩展基址寄存器,特殊是在数组和字符串操作中,它可以用来存储数组或字符串的基地址。别的,在调用操作体系函数时,ebx 有时也用于传递参数。
esi: extended source index register,扩展源索引寄存器,在字符串操作中非常有效。它通常用于存储源字符串或数据数组的起始地址,在字符串指令(如 stos 等)中自动递增,以便按顺序处理数据。
edi: extended destination index register,扩展目的索引寄存器,与 esi 相对应,在字符串操作中用于存储目的字符串或数据数组的起始地址。与 esi 相似,edi 也在字符串指令中自动递增,以接收来自源地址的数据。