IA32体系结构1(x86寄存器)

Intel Architecture 32位处理器,主要以80386为参考。包括以下几类寄存器:

1.通用寄存器

2.段寄存器

3.状态和控制寄存器

4.指令指针寄存器EIP

5.内存管理寄存器

6.控制寄存器

通用寄存器

IA32体系结构1(x86寄存器)_第1张图片
通用寄存器有8个,分别是EAX、EBX、ECX、EDX、ESI、EDI、EBP、ESP。intel通用寄存器很少,比起ARM动不动30多个,要少很多,intel有个惯用做法,就是某些指令会假设对一些寄存器的使用。比如字符串指令,会隐式使用ECX、EDI、ESI里面的内容作为操作数。另外,通用寄存器可以拆分为字(16位)、字节(8位)使用,比如EAX可以使用字寄存器AX,字节寄存器AH、AL。这些通用寄存器的特殊隐式用途,列举如下:

(1)EAX-作为操作数和结果数据的累加器。

(2)EBX-指向DS段中的数据。

(3)ECX-字符串和循环操作的计数器。

(4)EDX-I/O指针。

(5)ESI-指向DS段寄存器指向的段中的数据;字符串操作的源指针。

(6)EDI-指向ES段寄存器指向的段中的数据;字符串操作的目的指针。

(7)ESP-堆栈指针(SS指向的段中)。

(8)EBP-指向栈中的数据(SS指向的段中),常用作基址指针寄存器。

段寄存器

IA32体系结构1(x86寄存器)_第2张图片

段寄存器包括CS、DS、SS、ES、FS、GS,存放16位的段选择子。这些寄存器可以分成三类:代码、数据、堆栈。CS是代码段选择符。SS是堆栈段选择符,其它都是数据段选择符。CS段选择符不能显式加载,一般通过指令或者内部处理器操作隐式改变(比如过程调用、中断处理、任务切换),SS段选择符可以显式加载。32位保护模式下,段选择符里面存放指定格式的选择符,格式如下:

状态和控制寄存器

状态寄存器EFLAGS,包含一些状态标志、控制标志和系统标志。复位时,EFLAGS寄存器初值为0x00000002。

IA32体系结构1(x86寄存器)_第3张图片

指令指针寄存器

指令指针寄存器EIP里面包含当前代码段的一个偏移(offset),指定下一条将被执行的指令。EIP寄存器不能被软件直接访问,需要通过控制转移指令隐式改变(JMP、Jcc、CALL、RET、中断、异常等)。

内存管理寄存器

内存管理寄存器包括GDTR、IDTR、TR、LDTR,用以指定段式内存管理相关数据结构的地址。这些寄存器的内容通过特定的指令来装载和获取。这些寄存器的存在,完全是为了加速GDT、IDT、TSS、LDT等表和数据结构的查找和加载。试想一下,没有这样的寄存器,查表将是一件多么费劲的事情,而且也没法做到硬件处理,做不到硬件处理,运行时地址转换就是不现实的事情了。操作这些寄存器的特定指令如下:

(1)GDTR-LGDT/SGDT

(2)IDTR-LIDT/SIDT

(3)TR-LTR/STR

(4)LDTR-LLDT/SLDT

控制寄存器

IA32体系结构1(x86寄存器)_第4张图片

intel提供了CR0,CR1,CR2,CR3,CR4,用于操作处理器模式和当前执行任务的特性。

(1)CR0-包含系统控制标志,这些标志控制处理的操作模式和状态。

(2)CR1-保留

(3)CR2-包含页错误的线性地址

(4)CR3-包含页目录基地址,又叫做页目录基址寄存器(PDBR)

(5)CR4-包含一些标志,这些标志使能一些结构的扩展。

其中CR0的位0(PE)是保护模式使能位,该位只控制段级保护机制。CR0的31位(PG)是分页使能位,用于开启分页机制。

你可能感兴趣的:(linux内核及驱动,x86,IA32)