Intel 32 位处理器的工作模式

注:以下内容引用自 16位模式/32位模式下PUSH指令探究-《x86汇编语言:从实模式到保护模式》读书笔记16

如上图所示,Intel 32 位处理器有3种工作模式。
(1)实模式:工作方式相当于一个8086
(2)保护模式:提供支持多任务环境的工作方式,建立保护机制
(3)虚拟8086模式:这种方式可以使用户在保护模式下运行8086程序(比如cmd打开的console窗口,就是工作在虚拟8086模式)

最早期的8086 CPU(16位)只有一种工作方式,那就是实模式,而且数据总线为16位(一次最多能取2^16=64KB数据,实模式下每个段最大只有64KB),地址总线为20位(寻址的能力是2^20=1MB,实模式下CPU的最大寻址能力),实模式下所有寄存器都是16位。
从 80286 开始就有了保护模式,从 80386 开始 CPU 数据总线和地址总线均为 32 位,而且寄存器都是 32 位。但 80386 以及现在的奔腾、酷睿等等 CPU 为了向前兼容都保留了实模式。

有几点需要特别说明:
(1)保护模式可分为16位和32位的,由段描述符中的D标志指明。对于32位代码段和数据段,这个标志总是设为1;对于16位代码和数据段,这个标志被设置为0.
D=1:默认使用32位地址和32位或8位的操作数。
D=0:默认使用16位地址和16位或8位的操作数。(主要是为了能够在32位处理器上运行16位保护模式的程序)
指令前缀0x66用来选择非默认值的操作数大小,0x67用来选择非默认值的地址大小。
(2)在实模式下,也可以使用32位的寄存器,比如

1
2
mov eax,ecx
mov ebx,0x12345678

(3)在书中,把实模式和16位的保护模式统称为“16位模式”;把32位保护模式称为“32位模式”。
(4)32位处理器可以执行16位的程序,包括实模式和16位保护模式。
(5)当处理器在16位模式下运行时,可以使用32位的寄存器,执行32位运算。
(6)在16位模式下,数据的大小是8位或者16位的;控制转移和内存访问时,偏移量也是16位的。
(7)32位保护模式兼容80286的16位保护模式。
(8)在16位模式下,处理器把所有指令都看成是16位的。

结合(5)和(8),我们发现一个问题:当处理器运行16位模式下,既然把所有指令都看成16位的,那么怎么使用32位的寄存器,执行32位的运算呢?答案是利用指令前缀0x66和0x67。前面已经说过,指令前缀0x66用来选择非默认值的操作数大小,0x67用来选择非默认值的地址大小。

比如说,指令码0x40在16位模式下对应的指令是

1
inc ax

如果加上前缀0x66,也就是指令码66 40,当处理器在16位模式下运行,66 40对应的指令是

1
inc eax

同理,如果处理器运行在32位模式下,处理器认为指令是32位的,如果加了0x66,那么就表示指令的操作数是16位的。

显示 Gitment 评论