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