X86架构寄存器介绍

通用寄存器

8个通用寄存器,分别是:EAX、EBX、ECX、EDX、EBP、ESP、EDI、ESI,其中,低16为又可以组成8个16位的寄存器。另外,AX、BX、CX、DX,每个又可以细分为两个8位的寄存器。

在64位系统中,分别叫做RAX、RBX、RCX、RDX、RBP、RSP、RSI、RDI。

段寄存器

8086有6个16位的段寄存器:CS、DS、SS、ES、FS、GS。

  1. CS:代码段寄存器,指向包含程序指令的段
  2. DS:数据段寄存器,指向包含静态数据或全局数据的段
  3. SS:栈段寄存器,指向包含当前程序栈的段
  4. ES、FS、GS:一般用途,可以指向任何段

16位的段寄存器不能保存32位的段基地址,所以,需要增加段描述符(8字节),在段描述符中,分出4字节作为段基地址。而段寄存器只用来保存段选择符,段选择符用于定位段描述符表中的表项。

段选择符结构

16位长段选择符结构如下:

指令指针寄存器和标志寄存器

  1. EIP: 指令寄存器可以说是CPU中最最重要的寄存器了,它指向了下一条要执行的指令所存放的地址(相对于段寄存器CS的偏移量),CPU的工作其实就是不断取出它指向的指令,然后执行这条指令,同时指令寄存器继续指向下面一条指令,如此不断重复。EIP中低16位可以单独访问,叫做IP,用于16位寻址。在 x64 架构下,32位的 EIP 升级为64位的 RIP寄存器。
  2. EFLAGS: 标志寄存器,存放处理器标志位。

标志位

名称

说明

CF

Carry Flag

无符号数溢出(如 `ADD` 后进位)。算术操作产生的结果在最高有效位(most-significant bit)发生进位或借位则将其置1,反之清零。这个标志指示无符号整型运算的溢出状态,这个标志同样在多倍精度运算(multiple-precision arithmetic)中使用。

PF

Parity Flag

奇偶校验(最低字节中 1 的个数是否为偶数)。如果结果的最低有效字节(least-significant byte)包含偶数个1位则该位置1,否则清零。

AF

Adjust Flag

辅助进位标记。如果算术操作在结果的第3位发生进位或借位则将该标志置1,否则清零。这个标志在BCD(binary-code decimal)算术运算中被使用

ZF

Zero Flag

结果为零(`CMP` 后判断相等性)

SF

Sign Flag

结果为负数(最高位为 1)。该标志被设置为有符号整型的最高有效位。(0指示结果为正,反之则为负)

OF

Overflow Flag

有符号数溢出(如 `ADD` 后符号异常)。如果整型结果是较大的正数或较小的负数,并且无法匹配目的操作数时将该位置1,反之清零。这个标志为带符号整型运算指示溢出状态。

DF

Direction Flag

字符串操作方向。这个方向标志(位于EFLAGS寄存器的第10位)控制串指令(MOVS, CMPS, SCAS, LODS以及STOS)。设置DF标志使得串指令自动递减(从高地址向低地址方向处理字符串),清除该标志则使得串指令自动递增。STD以及CLD指令分别用于设置以及清除DF标志。

IF

Interrupt Flag

控制是否响应可屏蔽中断(`CLI` 禁用)。该标志用于控制处理器对可屏蔽中断请求(maskable interrupt requests)的响应。置1以响应可屏蔽中断,反之则禁止可屏蔽中断。

TF

Trap Flag

单步调试(触发 `INT 1` 异常)。将该位设置为1以允许单步调试模式,清零则禁用该模式。

IOPL

I/O Privilege Level

指示当前运行任务的I/O特权级(I/O privilege level),正在运行任务的当前特权级(CPL)必须小于或等于I/O特权级才能允许访问I/O地址空间。这个域只能在CPL为0时才能通过POPF以及IRET指令修改。

NT

Nested Task

这个标志控制中断链和被调用任务。若当前任务与前一个执行任务相关则置1,反之则清零。

RF

Resume Flag

控制处理器对调试异常的响应

VM

Virtual-8086 Mode

置1以允许虚拟8086模式,清除则返回保护模式。

AC

Alignment Check

该标志以及在CR0寄存器中的AM位置1时将允许内存引用的对齐检查,以上两个标志中至少有一个被清零则禁用对齐检查。

VIF

Virtual Interrupt Flag

该标志是IF标志的虚拟镜像(Virtual image),与VIP标志结合起来使用。使用这个标志以及VIP标志,并设置CR4控制寄存器中的VME标志就可以允许虚拟模式扩展(virtual mode extensions)

VIP

Virtual Interrupt Pending

该位置1以指示一个中断正在被挂起,当没有中断挂起时该位清零。【Software sets and clears this flag; the processor only reads it.】与VIF标志结合使用。

ID

ID Flag

程序能够设置或清除这个标志指示了处理器对CPUID指令的支持。

控制寄存器

CR0、CR1、CR2、CR3共四个控制寄存器。

CR0

标志位

说明

PE

保护(Protection Enable)标志。当设置该位时即开启了保护模式;当复位时即进入实地址模式。这个标志仅开启段级保护,而并没有启用分页机制。若要启用分页机制,那么PE和PG标志都要置位。

MP

数学存在位

EM

仿真位

TS

任务切换位.(Task Switched)标志。该标志用于推迟保存任务切换时的协处理器内容,直到新任务开始实际执行协处理器指令。处理器在每次任务切换时都会设置该标志,并且在执行协处理器指令时测试该标志

ET

Extension Type.当该标志为1时,表示指明系统中有80387协处理器,并使用32位协处理器协议。ET=0指明使用80287协处理器

NE

协处理器错误(Numeric Error)标志。当设置该标志时,就启用了x87协处理器错误的内部报告机制;若复位该标志,那么就使用PC形式的x87协处理器错误报告机制。

WP

对于Intel 80486或以上的CPU,CR0的位16是写保护(Write Proctect)标志。当设置该标志时,处理器会禁止超级用户程序(例如特权级0的程序)向用户级只读页面执行写操作;当该位复位时则反之。

AM

对齐掩码(Alignment Mask),该位用于控制内存对齐检查。

  • 当 AM = 1 时,处理器会执行内存对齐检查。
  • 当 AM = 0 时,处理器不会执行对齐检查。

NW

不直写(Not Write-through),该位用于控制写缓冲的写策略。

  • 当 NW = 1 时,处理器执行不通过写缓冲进行写操作,而直接写入内存。
  • 当 NW = 0 时,处理器使用写缓冲进行写操作。

CD

缓存禁用(Cache Disable),该位用于控制处理器的缓存。

  • 当 CD 为 1 时,处理器禁用数据缓存。
  • 当 CD 为 0 时,处理器启用数据缓存。

PG

CR0的位31是分页(Paging)标志。当设置该位时即开启了分页机制;当复位时则禁止分页机制,此时所有线性地址等同于物理地址

CR1

CR1是未定义的控制寄存器,供将来的处理器使用。

CR2

CR2是页故障线性地址寄存器,保存最后一次出现页故障(Page Fault)的全 32(或 64) 位线性地址。

CR3

标志位

说明

PWT

页级写穿标志位(Page-Level Write-Through),用于指定页表是否应用写穿策略。

PCD

页级高速缓存禁用标志位(Page-Level Cache Disable),用于指定页表是否应用高速缓存禁用策略。

CR4

VME:允许使用虚拟 8086 模式扩展。

PVI:保护模式虚拟中断。

TSD:禁用处理器在启动过程中使用时间戳计数器。

DE:允许调试扩展。

PSE:启用超级页(2MB页)

PAE:启用物理地址扩展,支持大于4GB的物理内存。

当 PAE = 1 时,是 2-9-9-12 分页。

当 PAE = 0 时, 是 10-10-12 分页。

MCE:启用机器检查异常。

PGE:启用全局页表。

PCE:启用性能监控计数器。

OSFXSR:允许操作系统使用 FXSAVE 和 FXRSTOR 指令进行 XMM 寄存器的保存和恢复。

OSXMMEXCPT:允许操作系统使用 SSE 指令集的浮点异常。

UMIP:防止用户模式下执行特权指令。

VMXE:启用虚拟机扩展。

SMXE:启用安全模式扩展。

FSGSBASE:启用 FS、GS 寄存器的基址存储。

PCIDE:启用 PCID(Process Context Identifier)。

OSXSAVE:启用 XSAVE 和 XRSTOR 指令。

SMEP:启用用户模式执行保护。

SMAP:启用内核空间和用户空间地址映射的严格分离。

总结

x86 寄存器系统通过分工协作实现高效计算与控制:通用寄存器处理数据操作,段寄存器管理内存分区,EFLAGS 跟踪状态,控制寄存器管理 CPU 模式。理解其设计对操作系统开发、逆向工程和性能优化至关重要。在 64 位模式下,寄存器扩展和新增的 R8-R15 进一步提升了复杂应用的效率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

灿烂的贝壳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值