32 位寄存器
当英特尔生产 80386 时,他们从 16 位处理器升级到 32 位处理器。32 位处理意味着两件事:被操作的数据都是 32 位,被访问的内存地址是 32 位。为了做到这一点,但仍然与他们早期的处理器兼容,他们为处理器引入了全新的模式。它可以是 16 位模式还是 32 位模式 - 但你可以逐个指令地覆盖此模式,用于数据,寻址或两者!
首先,他们必须定义 32 位寄存器。他们通过简单地将现有的 8 位从 16 位扩展到 32 位并给它们带有 E
前缀的扩展名称来实现这一点:EAX
,EBX
,ECX
,EDX
,ESI
,EDI
,EBP
和 ESP
。这些寄存器的低 16 位与之前相同,但寄存器的上半部分可用于 32 位操作,如 ADD
和 CMP
。上半部分不能单独访问,因为他们使用 8 位寄存器。
处理器必须具有独立的 16 位和 32 位模式,因为英特尔在许多操作中使用相同的操作码:16 位模式下的 CMP AX,DX
和 32 位模式下的 CMP EAX,EDX
具有完全相同的操作码! 这意味着无法在任一模式下运行相同的代码:
“立即进入
AX
”的操作码是0xB8
,后跟两个字节的立即值:0xB8 0x12 0x34
“立即进入
EAX
”的操作码是0xB8
,然后是立即值的四个字节:0xB8 0x12 0x34 0x56 0x78
因此,assember 必须知道处理器在执行代码时处于什么模式,以便它知道发出正确数量的字节。