14.8 与80286实地址模式的不同

80386的实地址模式和80286几乎没有什么不同,除了初始化过程外,对已有的80286程序不太可能有影响。

14.8.1 总线锁

80286和80386有着不同的总线锁实现方法。使用专属与80286的存储器锁的程序如果被传到80386的某个应用上,可能不会正常运行。

LOCK前缀以及相应的输出信号应该只是用来阻止总线控制器在数据移动过程中被中断。LOCK应该只是用在更新存储器的下列指令之前。在其他任何指令之前使用LOCK将导致未定义操作码异常。

  • 位测试与修改:BTS, BTR, BTC。
  • 交换:XCHG。
  • 一元算术和逻辑:INC, DEC, NOT和NEG。
  • 二元算术和逻辑:ADD, ADC, SUB, SBB, AND, OR, XOR。

锁指令只被授权由目的操作数定义的存储器区域,但也可以锁定一个更大的存储器区域。例如,典型的8086和80286配置锁定整个物理存储器空间。对于80386,定义的存储器区域被授权锁,以防止处理器在完全相同的区域执行锁指令,即相同的起始地址和相同的长度。

14.8.2 第一条指令的位置

80386的起始位置是0FFFFFFF0H(距32位地址空间末端16字节),不同于80286的0FFFFF0(距24位地址空间末端16字节)。许多80286 ROM初始化程序可以在这个环境下正常运行。其他的可以通过重定义外部硬件的A{31-20}来正常工作。

14.8.3 通用寄存器的初始值

80386的某些通用寄存器在复位后可能含有与80286不同的值。这不应该回引起兼容问题,因为8086的寄存器在复位后是未定义的。如果在上电过程中要求自检,并且检测到了错误,则EAX包含一个非零值。EDX包含部件和版本标识符。更多信息参见第十章。

14.8.4 MSW初始化

80286将MSW初始化成FFF0H,但是80386用0000H来初始化这个寄存器。这个差异应该没关系,因为不同的比特位在80286中未定义。读取MSW的程序只有在它们依赖于那些高位的未定义位的时候,才会在80386上有不同的表现。