Zwlin's Blog

80386 系统寄存器

Last updated: 2019/02/12     Published at: 2019/02/12

80386 的许多结构特性都只能被系统程序员所使用。这一章将对它的系统结构做一个概述。 80386 系统级特性包括以下几点:

这些特性是通过寄存器和指令实现的,以下几节将对它们进行介绍。这一章的目的只是对以后几章的一个概述,而不是对所有的细节进行描述。这一章所讲到的寄存器、指令将会做一些解释,或者在以后的章节中对其进行详细的说明。

系统寄存器 (System Registers)

为系统程序员设计的寄存器可以分为以下几类:

系统标志 (System Flags)

系统标志寄存器 EFLAGS 控制着 I/O、可屏蔽中断 (maskable interupts)、调试 (debuging)、任务切换 (task switching)、保护模式下虚拟 8086 方式的执行、多作务环境 (multitasking environment)。

设置 IF 使 CPU 可识别外部 (可屏蔽) 中断请求。复位 IF 则禁止中断。IF 对不可屏蔽外部中断和异常的识别没有任何作用。关于中断的详细信息,请参看第 9 章的描述。

处理器用嵌套位来控制被中断或被调用的任务链。NT 对 IRET 指令的操作有影响。更多的信息请参看第 7 章和第 9 章。

RF 位暂时禁止调试异常,以便一条指令可以在一个调试异常结束后立即重看书而且不会引发另一个调试异常。参看第 12 章以获得更多的细节。

设置 TF 可以让处理器工作在单步调试模式。在此模式下,CPU 每执行完一条指令后将自动引发一个异常,这样可以在程序每执行完一条指令后对程序进行查询。单步仅仅是 80386 众多调试特性的一个。参看第 12 章以获得更多的细节。

当此位设置时,VM 标志说明一个任务正在执行一个 8086 程序。参看第 14 章以得到更多 80386 在保护模式下执行 8086 任务、多任务环境的详细介绍。

内存管理寄存器 (Memory–Management Registers)

80386 有 4 个寄存器来寻址特定的数据结构,它们用来实现段式内存管理。

这些寄存器指向段描述符表 GDT 和 LDT。第 5 章对通过描述符表来寻址的机制做了详细的介绍。

这个寄存器指向一张包含中断处理子程序入口点的表 (IDT)。第 9 章对中断机制进行的详细介绍。

这个寄存器指向当前任务信息存放处,这些信息是处理器所需要的。第 7 章对 80386 的多任务特性做了介绍。

控制寄存器 (Control Registers)

图 4-2 显示了 80386 的控制寄存器,CR0、CR2、和 CR3。这些寄存器可以通过 MOV 指令的一些变种形式被系统程序员所访问,这样便可以把它们存入通用寄存器或从通用寄存器中加载,例如:

MOV      EAX ,     CR0
MOV      CR3 ,     EBX

EM 指示协处理器功能是否通过摸拟来实现。更多的信息请参看第 11 章。

ET 指明了系统内协处理器的类型 (80287 或 80387)。详细情况请查看第 11 章和第 10 章。

MP 控制 WAIT 指令的执行,WAIT 用于系统与协处理器的同步。第 11 章对其进行详细介绍。

设置 PE 将让处理器工作在保护模式下。复位 PE 将返回到实模式工作。关于模式切换请参看第 14 章和第 10 章。

PG 指明处理器是否通过页表来转换线性地址到物理地址。关于分页地址转换请查看第 5 章。关于如何设置 PG 位,请查看第 10 章。

处理器第次做任务切换时将设置 TS 位,当执行协处理器指令时将会测试 TS 位。详细信息请查看第 11 章。

调试寄存器 (Debug Register)

调试寄存器使 80386 有很好的调试功能,包括断点、不改变代码段情况下设置指令断点。关于它们的格式和用途请参看第 12 章。

测试寄存器 (Test Registers)

测试寄存器并不是 80386 体系结构的标准部件。它们仅仅是用来测试 TLB 地址转换信息,这些存贮的是来自页表中的。查看第 12 章,关于怎样使用这些寄存器。

系统指令 (System Instructions)

系统指令能完成以下功能:

  1. 检测指针参数 (Verification of pointer parameters)(参看第 6 章):
    • ARPL —— 调整 RPL (Adjust RPL)
    • LAR —— 加载访问权限 (Load Access Rights)
    • LSL —— 加载段界限 (Load Segment Limit)
    • VERR —— 读检验 (Verify for Reading)
    • VERW —— 写检验 (Verify for Writing)
  2. 寻址描述符表 (Addressing descriptor tables)(参看第 5 章):
  1. 多任务 (Multitasking) (参看第 7 章):

    • LTR —— 加载任务寄存器 (Load Task Register)

    • STR —— 存储任务寄存器 (Store Task Register)

  2. 协处理器和多处理器 (Coprocessing and Multiprocessing) (参看第 11 章):

    • CLTS —— 清除任务已切换标志 (Clear Task-Switched Flag)

    • ESC —— 转译指令 (Escape instructions)

    • WAIT —— 等待直到协处理器空闲 (Wait until Coprocessor not Busy)

    • LOCK —— 引发总线锁信号 (Assert Bus-Lock Signal)

  3. 输入和输出 (Input and Output) (参看第 8 章):

    • IN —— 输入
    • OUT —— 输出
    • INS —— 输入串
    • OUTS —— 输出串
  4. 中断控制 (Interrupt control) (参看第 9 章):

    • CLI —— 清除中断允许标志位 (Clear Interrupt-Enable Flag)
    • STI —— 设置不断允许标志位 (Set Interrupt-Enable Flag)
    • LIDT —— 加载中断描述符表寄存器 (Load IDT Register)
    • SIDT —— 存储中断描述符表寄存器 (Store IDT Register)
  5. 调试 (Debugging) (参看第 12 章):

    • MOV —— 向调试寄存器输入或输出 (Move to and from debug registers)
  6. TLB 测试 (TLB testing)(参看第 10 章):

    • MOV —— 向测试寄存器输入或输出 (Move to and from test registers)
  7. 系统控制 (System Control):

    • SMSW —— 保存机器状态字 (Set MSW)
    • LMSW —— 加载机器状态字 (Load MSW)
    • HLT —— 处理器挂起 (HALT Processor)
    • MOV —— 向控制寄存器输入或输出 (Move to and from control registers)

SMSW 和 LMSW 指令主要用于兼容 80286 处理器。80386 程序可以通过变形的 MOV 指令访问 CR0,来访问 MSW。HLT 指令使处理器停止工作,直到收到了个 INTR 或者 RESET 信号。

除了在上面提到的章节外,每条指令还可以在第 17 章,中找到相关介绍。