本文主要是介绍IA32体系结构1(x86寄存器),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Intel Architecture 32位处理器,主要以80386为参考。包括以下几类寄存器:
1.通用寄存器
2.段寄存器
3.状态和控制寄存器
4.指令指针寄存器EIP
5.内存管理寄存器
6.控制寄存器
通用寄存器
通用寄存器有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指向的段中),常用作基址指针寄存器。
段寄存器
段寄存器包括CS、DS、SS、ES、FS、GS,存放16位的段选择子。这些寄存器可以分成三类:代码、数据、堆栈。CS是代码段选择符。SS是堆栈段选择符,其它都是数据段选择符。CS段选择符不能显式加载,一般通过指令或者内部处理器操作隐式改变(比如过程调用、中断处理、任务切换),SS段选择符可以显式加载。32位保护模式下,段选择符里面存放指定格式的选择符,格式如下:
状态和控制寄存器
状态寄存器EFLAGS,包含一些状态标志、控制标志和系统标志。复位时,EFLAGS寄存器初值为0x00000002。
指令指针寄存器
指令指针寄存器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
控制寄存器
intel提供了CR0,CR1,CR2,CR3,CR4,用于操作处理器模式和当前执行任务的特性。
(1)CR0-包含系统控制标志,这些标志控制处理的操作模式和状态。
(2)CR1-保留
(3)CR2-包含页错误的线性地址
(4)CR3-包含页目录基地址,又叫做页目录基址寄存器(PDBR)
(5)CR4-包含一些标志,这些标志使能一些结构的扩展。
其中CR0的位0(PE)是保护模式使能位,该位只控制段级保护机制。CR0的31位(PG)是分页使能位,用于开启分页机制。
这篇关于IA32体系结构1(x86寄存器)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!