32 位寄存器

当英特尔生产 80386 时,他们从 16 位处理器升级到 32 位处理器。32 位处理意味着两件事:被操作的数据都是 32 位,被访问的内存地址是 32 位。为了做到这一点,但仍然与他们早期的处理器兼容,他们为处理器引入了全新的模式。它可以是 16 位模式还是 32 位模式 - 但你可以逐个指令地覆盖此模式,用于数据,寻址或两者!

首先,他们必须定义 32 位寄存器。他们通过简单地将现有的 8 位从 16 位扩展到 32 位并给它们带有 E 前缀的扩展名称来实现这一点:EAXEBXECXEDXESIEDIEBPESP。这些寄存器的低 16 位与之前相同,但寄存器的上半部分可用于 32 位操作,如 ADDCMP。上半部分不能单独访问,因为他们使用 8 位寄存器。

处理器必须具有独立的 16 位和 32 位模式,因为英特尔在许多操作中使用相同的操作码:16 位模式下的 CMP AX,DX 和 32 位模式下的 CMP EAX,EDX 具有完全相同的操作码! 这意味着无法在任一模式下运行相同的代码:

“立即进入 AX”的操作码是 0xB8,后跟两个字节的立即值:0xB8 0x12 0x34

“立即进入 EAX”的操作码是 0xB8,然后是立即值的四个字节:0xB8 0x12 0x34 0x56 0x78

因此,assember 必须知道处理器在执行代码时处于什么模式,以便它知道发出正确数量的字节。