我们说的实地址模式(Real-address Mode),其实是IA-32架构或Intel 64架构提供的一种工作模式,该模式基本上提供了和8086上一样的执行环境,除此之外,还带有一些扩展,基本能运行原本在8086,8088,80186,80188上运行的程序。
首先,是和8086上一样的执行环境部分
- 可寻址的内存空间,范围[0, 1M]。因最初支持实地址模式的8086处理器只有20条地址线,所以其寻址范围最大只能去到2^20。
- 用于各种用途的寄存器:
- 通用寄存器。这些寄存器负责临时存放运算结果,或临时存放运算需要的操作数,或临时存放操作数在内存中的地址,或辅助构筑栈(Stack)。它们是:AX, BX, CX, DX, SI, DI, BP, SP。
- 段寄存器。这些段寄存器负责存放段的基地址(准确点,实模式下的地址计算是通过将段寄存器里的数值左移4位得到的)。根据指令的需要,有这些段:代码段、数据段、栈段。这些段寄存器包括:CS, DS, ES, SS。
- FLAGS标记寄存器。该寄存器存放各种标记控制信息。
- IP寄存器。该寄存器存放下一条要执行的指令在代码段里的偏移,它联合CS决定了下一条要执行的指令在内存里的地址(即CS<<4+IP)。
- 专注浮点运算的寄存器。最初支持实地址模式的8086处理器,需要一个叫8087 math协处理器来执行浮点运算。
- 可寻址的IO空间。处理器的数据线和地址线除了可用于内存数据的传输和寻址外,还可以用于与其它外部设备进行数据的传输和寻址外部设备。(当然,也可以通过Memory-mapped IO来访问外部设备的数据)。IO空间的寻址范围为[0,FFFFH]。处理器提供了专门的指令来访问IO空间里的数据。
- 中断的机制(耳熟能详的中断向量表)。
- 支持8086上所有的指令集。
接下来,是扩展的部分
- 利用操作数大小修饰符(Operand Size Override Prefix),可访问32位的操作数。在此情况下,可访问32位的寄存器EAX, EBX, ECX, EDX, ESP, EDI, ESI。
- 可访问增加的两个寄存器FS和GS。
- 可执行一些8086里没有的指令,这些指令是后面IA-32架构的处理器引入的。
- 利用地址大小修饰符(Address Prefix),可指定32位的地址偏移(但这个貌似没什么用?因为实地址模式的寻址空间只有1M)。