寄存器
基本寄存器可以归纳为如下几类:
- 通用寄存器
- 段寄存器
- 状态和控制寄存器
- 指令寄存器
32位通用寄存器有八个,eax, ebx, ecx, edx, esi, edi, ebp, esp,
他们主要用作逻辑运算、地址计算和内存指针,具体功能如下:
eax 累加和结果寄存器
ebx 数据指针寄存器
ecx 循环计数器 count
edx i/o指针
esi 源地址寄存器
edi 目的地址寄存器
esp 堆栈指针
ebp 栈指针寄存器
当然,以上功能并未限制寄存器的使用,特殊情况为了效率也可作其他用途。
这八个寄存器低16位分别有一个引用别名 ax, bx, cx, dx, bp, si, di, sp,
其中 ax, bx, cx, dx, 的高8位又引用至 ah, bh, ch, dh,低八位引用至 al, bl, cl, dl
64位寄存器
在 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 堆栈段寄存器
注意一下代码段和堆栈段,es:eip访问代码
在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 —— 局部描述符表信息

浙公网安备 33010602011771号