寄存器介绍

寄存器是CPU的组成部分,因为在CPU内,所以CPU对其读写速度是最快的,不需要IO传输,但同时也决定了此类寄存器数量非常有限,有限到几乎每个存储都有自己的名字,而且有些还有多个名字。

IA-32构架提供了16个基本寄存器,这16个基本寄存器可以归纳为如下几类:

  • 通用寄存器
  • 段寄存器
  • 状态和控制寄存器
  • 指令寄存器
通用寄存器

32位通用寄存器有八个,eax, ebx, ecx, edx, esi, edi, ebp, esp,

他们主要用作逻辑运算、地址计算和内存指针,具体功能如下:

  • eax 累加和结果寄存器
  • ebx 数据指针寄存器
  • ecx 循环计数器
  • edx i/o指针
  • esi 源地址寄存器
  • edi 目的地址寄存器
  • esp 堆栈指针
  • ebp 栈指针寄存器

当然,以上功能并未限制寄存器的使用,特殊情况为了效率也可作其他用途。

这八个寄存器低16位分别有一个引用别名 ax, bx, cx, dx, si, di, sp, bp。

其中 ax, bx, cx, dx, 的高8位又引用至 ah, bh, ch, dh,低八位引用至 al, bl, cl, dl

在 64-bit 模式下,有16个通用寄存器,但是这16个寄存器是兼容32位模式的,32位方式下寄存器名分别为 eax, ebx, ecx, edx, edi, esi, ebp, esp, r8d – r15d。在64位模式下,他们被扩展为 rax, rbx, rcx, rdx, rdi, rsi, rbp, rsp, r8 – r15。其中 r8 – r15 这八个寄存器是64-bit模式下新加入的寄存器。

段寄存器

段寄存器 cs, ds, ss, es, fs, gs, 保存16位的段选择子,一个段选择子指定了一个段在内存的指针,

以便再内存中访问段,访问方式与内存模式有关,段模式和平坦模式其代表的意义并不相同。

  • cs 代码段寄存器

  • ds, es, fs, gs 数据段寄存器

  • ss 堆栈段寄存器

在 64-bit 模式下,这6个寄存器并无变化,只是使用上略有区别。

状态和控制寄存器 eflags

这个寄存器表示的意义非常丰富,程序中并不直接操作此寄存器,并由此衍生出很多操作指令。
除去一些保留位,其他每位都代表一个具体的含义,其中 bits 0, 2, 4, 6, 7, 11 是状态位,标识了某此操作后的状态:

  • CF (bit 0) —— 进位标识,算术操作进行了进位和借位,则此位被设置
  • PF (bit 2) —— 奇偶标识,结果包含奇数个1,则设置此位
  • AF (bit 4) —— 辅助进位标识,结果的第3位像第4位借位,则此位被设置
  • ZF (bit 6) —— 零标识,结果为零,此位设置
  • SF (bit 7) —— 符号标识,若为负数则设置此位
  • OF (bit 11) —— 溢出标识,结果像最高位符号位进行借位或者进位,此标志被设置

8, 9, 10 位为控制标识:

  • TF (bit 8) —— 陷阱标识,设置进程可以被单步调试

  • IF (bit 9) —— 中断标识,设置能够响应中断请求

  • DF (bit 10) —— 方向标识,用于标示字符处理过程中指针移动方向

64-bit模式下,该寄存器被扩展为64位,rflags,但是其高32位保留未被使用,其低32位所表示含义与32位模式相同。

指令寄存器 EIP

EIP —— 标志当前进程将要执行指令位置,在64位模式下扩展为 RIP 64位指令寄存器。

控制寄存器
  • cr0
  • cr2
  • cr3
  • cr4
系统表指针寄存器
  • idtr —— 中断描述符表信息
  • gdtr —— 全局描述符表信息
  • ldtr —— 局部描述符表信息
任务寄存器tr

保存任务的状态信息 tss

调试寄存器

dr0 – dr7,控制和允许监视进程的调试操作

x87 FPU 寄存器

这组指令专门用过浮点运算,因为浮点运算尤其固有的特性,所以需要使用一组独立寄存器。
数据寄存器包括 r0 – r7 的8个 80 位寄存器,汇编程序中通过名字 st(x) 引用,另外还有3个16位寄存器,分别是控制寄存器,状态寄存器,标记寄存器。这里的省略具体含义的介绍。

MMX 寄存器

MMX 为一种 SIMD 技术,即可通过一条指令执行多个数据运算,共有8个64位寄存器,分别为mm0 – mm7,它与其他普通64位寄存器的区别在于通过它的指令进行运算,可以同时计算2个32位数据,或者4个16位数据等等,可以应用为图像处理过程中图形 颜色的计算。

另外需要特别注意的是,MMX并非一种新的寄存器,而是FPU 80位寄存器的低64位,也就是说,使用MMX指令集,会影响浮点运算!

XMM 寄存器

XMM 同 MMX,只是他有 8 个 128 位寄存器,分别为 xmm0 – xmm7,另外还包含计算过程中的状态和控制寄存器。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章