概述
任一时刻, 计算机都在执行一个程序 (进程), 这个正在执行的状态可以用以下内容唯一确定:
- 程序的代码
- 当前寄存器组的状态
- 堆和栈的数据
知道了以上三者, 可以唯一确定现在计算机正在执行哪个程序, 执行的是该程序的哪一个函数的哪一行.
由于程序的代码一般是不变的, 所以一个程序的多个实例如果同时执行(同一程序的多个进程), 那么它们共享同一个程序代码, 但是每一个进程都有自己各自的寄存器组状态和堆栈数据. 同理, 同一进程的多个线程拥有各自的寄存器组状态和栈, 共享同一个进程的堆栈数据.
本专题以 IA-32 架构为语境.
寄存器
| 名称 | 用法 |
|---|---|
| %eax | 随便用 |
| %ebx | 随便用, 使用完要恢复初值 |
| %ecx | 随便用 |
| %edx | 随便用 |
| %esi | 随便用, 使用完要恢复初值 |
| %edi | 随便用, 使用完要恢复初值 |
| %esp | 指向栈顶, 表示当 |

本文介绍了计算机程序执行时的状态组成,重点讲解了IA-32架构中栈帧的概念,包括%esp和%ebp寄存器的作用。栈帧用于存储函数的局部变量和参数,每次函数调用都会创建一个新的栈帧。通过%ebp可以找到栈帧内的变量位置,而%esp则定义了栈帧的边界。文章通过C语言代码的汇编转换,详细阐述了栈帧的创建、使用和释放过程。
最低0.47元/天 解锁文章
1791

被折叠的 条评论
为什么被折叠?



