一、32位CPU系统级寄存器和数据结构
二、寄存器分类介绍
通用寄存器:8个,分别为EAX,EBX,ECX,EDX,ESP,EBP,ESI,EDI
标志寄存器:1个,EFLAGS
控制寄存器:5个,分别为CR0-CR4
调试寄存器:8个,分别为DR0-DR7
系统地址寄存器:4个,GDTR、IDTR、LDTR和TR
16位段寄存器:6个,分别为CS,DS,ES,FS,GS,SS
其他寄存器:EIP、TSC等
三、寄存器详解
1.通用寄存器:EAX,EBX,ECX,EDX,ESP,EBP,ESI,EDI
(1)尽管这8个通用寄存器大多时候是通用的,可以用作任何用途,但是在某些情况下,他们也有隐含的用法。比如ECX、ESI和EDI在串循环操作中分别用作计数器、源和目标。EBP和ESP主要用来维护栈,ESP通常指向栈的顶部,EBP指向当前栈帧的起始地址。
(2)EAX, EBX, ECX, EDX都可以作为32位寄存器、16位寄存器或者8位寄存器使用。EAX可作为累加器用于乘法、除法及一些调整指令,对于这些指令,累加器常表现为隐含形 式。EAX寄存器也可以保存被访问存储器单元的偏移地址。EBX常用于地址指针,保存被访问存储器单元的偏移地址。ECX经常用作计数器,用于保存指令的 计数值。ECX寄存器也可以保存访问数据所在存储器单元的偏移地址。用于计数的指令包括重复的串指令、移位指令和循环指令。移位指令用CL计数,重复的串 指令用CX计数,循环指令用CX或ECX计数。EDX常与EAX配合,用于保存乘法形成的部分结果,或者除法操作前的被除数,它还可以保存寻址存储器数据。
(3)EBP和ESP是32位寄存器,也可作为16位寄存器BP, SP使用,常用于椎栈操作。
(4)EDI和ESI常用于串操作,EDI用于寻址目标数据串,ESI用于寻址源数据串。
2.标志寄存器:EFLAGS
控制任务状态和模式切换、中断处理、指令追踪和访问权限控制.寄存器中的标志位需要特权指令代码才可以修改(特权指令:运行在内核态下的代码)
(1) EFLAGS寄存器的状态标志(0、2、4、6、7以及11位)指示算术指令(如ADD, SUB, MUL以及DIV指令)的结果,这些状态标志的作用如下:
CF(bit 0) [Carry flag] 若算术操作产生的结果在最高有效位(most-significant bit)发生进位或借位则将其置1,反之清零。这个标志指示无符号整型运算的溢出状态,这个标志同样在多倍精度运算(multiple-precision arithmetic)中使用。
PF(bit 2) [Parity flag] 如果结果的最低有效字节(least-significant byte)包含偶数个1位则该位置1,否则清零。
AF(bit 4) [Adjust flag] 如果算术操作在结果的第3位发生进位或借位则将该标志置1,否则清零。这个标志在BCD(binary-code decimal)算术运算中被使用。
ZF(bit 6) [Zero flag] 若结果为0则将其置1,反之清零。
SF(bit 7) [Sign flag] 该标志被设置为有符号整型的最高有效位。(0指示结果为正,反之则为负)
OF(bit 11) [Overflow flag] 如果整型结果是较大的正数或较小的负数,并且无法匹配目的操作数时将该位置1,反之清零。这个标志为带符号整型运算指示溢出状态。
(2) DF(位于EFLAGS寄存器的第10位)控制串指令(MOVS, CMPS, SCAS, LODS以及STOS)。设置DF标志使得串指令自动递减(从高地址向低地址方向处理字符串),清除该标志则使得串指令自动递增。STD以及CLD指令分别用于设置以及清除DF标志。
(3) 系统标志以及IOPL域(System Flags and IOPL Field)
EFLAGS寄存器中的这部分标志用于控制操作系统或是执行操作,它们不允许被应用程序所修改。这些标志的作用如下:
TF(bit 8) [Trap flag] 将该位设置为1以允许单步调试模式,清零则禁用该模式。
IF(bit 9) [Interrupt enable flag] 该标志用于控制处理器对可屏蔽中断请求(maskable interrupt requests)的响应。置1以响应可屏蔽中断,反之则禁止可屏蔽中断。
IOPL(bits 12 and 13) [I/O privilege level field] 指示当前运行任务的I/O特权级(I/O privilege level),正在运行任务的当前特权级(CPL)必须小于或等于I/O特权级才能允许访问I/O地址空间。这个域只能在CPL为0时才能通过POPF以及IRET指令修改。
NT(bit 14) [Nested task flag] 这个标志控制中断链和被调用任务。若当前任务与前一个执行任务相关则置1,反之则清零。
RF(bit 16) [Resume flag] 控制处理器对调试异常的响应。
VM(bit 17) [Virtual-8086 mode flag] 置1以允许虚拟8086模式,清除则返回保护模式。
AC(bit 18) [Alignment check flag] 该标志以及在CR0寄存器中的AM位置1时将允许内存引用的对齐检查,以上两个标志中至少有一个被清零则禁用对齐检查。
VIF(bit 19) [Virtual interrupt flag] 该标志是IF标志的虚拟镜像(Virtual image),与VIP标志结合起来使用。使用这个标志以及VIP标志,并设置CR4控制寄存器中的VME标志就可以允许虚拟模式扩展(virtual mode extensions)
VIP(bit 20) [Virtual interrupt pending flag] 该位置1以指示一个中断正在被挂起,当没有中断挂起时该位清零。【Software sets and clears this flag; the processor only reads it.】与VIF标志结合使用。
ID(bit 21) [Identification flag] 程序能够设置或清除这个标志指示了处理器对CPUID指令的支持。
3.控制寄存器:CR0-CR4
作用:控制寄存器决定处理器的操作模式和当前执行任务的一些特征
种类:
CR0: 控制系统的工作模式和处理器的状态
CR1: 保留
CR2 :保留出错的线性地址
CR3:页目录基址的物理地址和PCD和PWT标志位(和CACHE有关)
CR4:一些结构的扩展.表明对于特定的处理器和操作系统执行支持.
CR0
PG:分页有效时,置位为1,清空时为0.与PE一同使用.该指令表明是否使用页表将线性地址转换成物理地址
CD: cache 缺失设置位
NW:直写无效(直写:高速缓存中的数据始终保持与主存储器中数据匹配 )
AM: 对齐功能屏蔽(与EFLAGS寄存器中 AC标志位一同使用)
WP:写保护
NE: 数字错误标志位(与浮点协处理器共同使用)
ET: 扩展类型.设置有效位时,支持 ntel 387 DX 数学协处理器指令.
TS: 每当任务切换时就设置该位,并且在解释协处理器指令之前测试该位
EM;该位表明是否需要仿真协处理器的功能
MP:协处理器监视标志位
PE: 保护模式使能,当设置有效位,CPU工作在保护模式.反之,实模式.
CR3:
PCD:控制当前页目录表的缓冲,当设置清空时,缓冲.置位时,缓冲无效.与CR0中的CD或PG一同使用
PWT:控制cache采取直写还是回写的策略.当设置清空时,回写有效.当置位时,直写有效.
CR4:
VME:虚地址模式.当清空时,无效.
PVI:保护模式虚中断,当清空时,无效
TSD:时间戳允许标志位.当清空时,允许RDTSC指令执行在任务特权级上.当置位时,只允许工作在特权级0.
DE:调试扩展.置位,表明DR4与DR5将产生没有定义的异常
PSE:当置位,使用4M的页面;清空,使用4K的页面
PAE:置位,使用36物理内存的分页机制.清空时,使用32位分页机制
MCE:置位,使用机器检查异常机制.
PGE:置位,启动全局页面.当写CR3时,也不会被替换.
PCE:置位,表明使RDPMC指令工作在任何保护级别.
OSFXSR:置位.表明操作系统支持FXSAVE and FXRSTOR指令
OSXMMEXCPT:置位.表明操作系统支持不可屏蔽的SIMD浮点异常.
4.调试寄存器:DR0-DR7
调试寄存器主要作用是调试应用代码、系统代码、开发多任务操作系统.来监视代码的运行和处理器的性能.
DR0-DR3:保留32位断点的线性地址.
DR6
B0—B3:断点状态的监测
BD:调试寄存器访问监测.置位,表明在指令流中,下一条指令将访问其中的一个调试寄存器
BS:单步执行标志位
BT:任务转换标志位
DR7:
L0—L3:局部断点使能标志位
G0--G3: 全局断点使能标志位
LE AND GE:置位,表明处理器可以监测导致数据断点的指令.推荐置位为1.
GD:通用监测使能标志位.表明是否开启调试寄存器保护.
LEN0 through LEN3 : 用来表明相应断点地址寄存器内存位置的大小.
R/W0 through R/W3: 相应断点的状态
5.系统地址寄存器:GDTR、IDTR、LDTR和TR
(1) 全局描述符表寄存器GDTR,是一个48位寄存器,用来存放全局描述符表GDT的32位线性基地址和16位的界限值。在全局描述符表中不仅包括有操作系统使用的描述符,而且还有所有任务使用的公用描述符。
(2) 中断描述符表寄存器IDTR,是一个48位寄存器,用来存放中断描述符表IDT的32位线性基地址和16位的界限值。
(3) 局部描述符表寄存器LDTR,是一个16位寄存器,用来存放局部描述符表LDT的16位选择符。另外还有一个隐含的描述符高速缓冲寄存器,用来存放LDT表描述符。
(4) 任务状态寄存器TR,是一个16位寄存器,用来存放任务状态段TSS的16位选择符。与之相应,也有一个隐含的描述符高速缓冲寄存器,用来存放任务状态段TSS的描述符。
6.16位段寄存器:CS,DS,ES,FS,GS,SS
段寄存器有两部分,一部分是编程可见的选择器寄存器,为6个16位寄存器,对应在另一部分有6个64位的描述符寄存器,后一部分是编程不可见的。
在实地址方式或虚拟8086方式,描述符寄存器不起作用,选择器寄存器退化成16位CPU的段寄存器功能,存放内存段的段基址——段首地址的高16位,其中CS对应于代码段、SS对应于堆栈段,DS对应于数据段,ES对应于附加数据段,在串操作时,DS和ES分别对应于源数据段和目的数据段。FS和GS没有定义。
7.其他寄存器:EIP、TSC
(1)指令指针指示器--EIP
它是32位寄存器,低16位称为IP,用与兼容16位CPU,其内容是下一条要取入CPU的指令在内存中的偏移地址。当一个程序开始运行时,系统把EIP清零,每取入一条指令,EPI自动增加取入CPU的字节数目。所以称EIP为指令指针。
(2)时间戳寄存器--TSC
每个时钟周期时其值加1,重启时清零。通过RDTSC指令读取TSC寄存器,只有当CR4寄存器的TSD位为0时,才可以在任何优先级下执行该指令,否则只能在特权级下执行该指令。
(3) 浮点寄存器
由于在80486微处理器内部设有浮点运算器,因此在其内部有相应的寄存器,其中包括8个80位通用数据寄存器、1个48位指令指针寄存器、1个48位数据指针寄存器、1个16位控制字寄存器、1个16位状态字寄存器和1个16位标记字寄存器。
四、CPU复位后各寄存器的值
复位(包括硬复位、软复位、初上电)后CPU各寄存器的值列于表2.1中。表中BIST为复位期间80486微处理机运行内存自检功能。
复位后CR0中的PE位为0(CR0为60000000H)。所以复位后CPU处于实地址工作方式。这时CS=0F000H,EIP=0FFF0H,所以CPU访问的第一个内存单元的物理地址为0FFFFFFF0H。
表1 复位后各寄存器的值 寄存器 初始值(BIST) 初始值(NO BIST)
EAX 0(通过) 不定
ECX 不定 不定
EDX 0400+版本ID 0400+版本ID
EBX 不定 不定
ESP 不定 不定
EBP 不定 不定
ESI 不定 不定
EDI 不定 不定
EFLAGS 0000002H 0000002H
EIP 0FFF0H 0FFF0H
ES 0000H 0000H
CS F000H F000H
SS 0000H 0000H
DS 0000H 0000H
续表 寄存器 初始值(BIST) 初始值(NO BIST)
FS 000H 000H
GS 000H 000H
IDTR 基值=0,界限=3FFH 基值=0,界限=3FFH
CR0 60000000H 60000000H
DR7 00000000H 00000000H
CW 037FH 不变
SW 0000H 不变
TW FFFFH 不变
FIP 00000000H 不变
FEA 00000000H 不变
FCS 0000H 不变
FDS 0000H 不变
FOP 000H 不变
FSTACK 不定 不变
原文地址:http://blog.chinaunix.net/uid-27717694-id-3943419.html