Zwlin's Blog

80386系统寄存器

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章,中找到相关介绍。