寄存器是CPU内部用来存放数据的一些小型存储区域,与我们常说的RAM(随机寄存器,内存)有些不同。
CPU要访问RAM中的数据时要经过较长的物理路径,花费时间较长,而寄存器集成在CPU的内部,拥有非常高的读写速度。
0x1 基本程序运行寄存器
- 通用寄存器(32位,8个)
- 段寄存器(16位,6个)
- 程序状态与控制寄存器(32位,1个)
- 指令指针寄存器(32位,1个)
通用寄存器
通用寄存器是一种通用型的寄存器,用于传送和暂存数据,也可以参与算数逻辑运算,并保存结果。IA-32中每个通用的寄存器都是32位,即4字节,主要用来保存常量与地址等,由特定汇编指令来操作特定寄存器。
EAX 32位 ,AX :EAX的低16位 ,AH:AX的高8位 ,AL:AX的低8位
寄存器名称如下:
EAX:针对操作数和结果数据的累加器
EBX:(DS段中的数据指针)基址寄存器
ECX:(字符串和循环操作的)计数器
EDX:(I/O指针)数据寄存器
以上四个寄存器主要用在算数运算(ADD,SUB,XOR,OR)指令中,常常用来保存常量与变量的值。某些汇编指令(MUL,DIV,LODS等)直接用来操作特定寄存器,执行这些命令后,仅仅改变特定寄存器的值。ECX在循环计数,EAX通常用在函数的返回值中。
EBP:(SS段中栈内数据指针)扩展基址指针寄存器
ESI:(字符串操作源指针)源变址寄存器
EDI:(字符串操作目标指针)目的变址寄存器
ESP:(SS段中栈指针)栈指针寄存器
以上四个寄存器主要用作保存内存地址的指针。ESP指示栈区域的栈顶地址,某些指令(PUSH, POP, CALL, RET)可以直接用来操作ESP。EBP是栈区域的基地址。ESI与EDI与特定指令(LODS, STOS,REP, MOVS等)一起使用,主要用于内存复制
0x2 段寄存器
IA-32的保护模式中,段是一种内存保护技术,它把内存划分为多个区段,并为每个区段赋予起始地址、范围、访问权限等,以保护内存。此外,他还同分页技术一起用于将虚拟地址变更为实际物理内存。段内存记录在SDT(段描述符表)中,而段寄存器就持有这些SDT的索引。段寄存器总共6中寄存器组成,分别是CS , SS, ES, FS, GS,每个寄存器的大小为16位,即2个字节。每个寄存器指向的段描述符与虚拟地址结合,形成一个线性地址,借助分页技术,线性地址最终被转换为实际的物理地址。
CS: 代码段寄存器,用于存放代码所在段的段基址
SS: 栈段寄存器,用于存放栈段的段基址
DS: 数据段寄存器,用户存放数据段的段基址
ES: 附加(数据)寄存器,用来存放程序使用的附加数据段的段基址
FS: 数据段寄存器,用来存放程序使用的附加数据段的段基址。它也用于计算SEH(结构化异常处理机制),TEB(线程环境块),PEB(进程环境块)等地址
GS: 数据段寄存器,用来存放程序使用的附加数据段的段基址
0x3 程序状态与控制寄存器
EFLAGS: Flag Register,标志寄存器,32位,4个字节。每一位都有意义,值为0或者1,代表ture/false。这个寄存器共32个位元。初级掌握几个就可以。
ZF(零标志):运算结果为0,则值为1
OF(溢出标志):有符号整数溢出时,OF值被置为1。此外,MSB(最高有效位)改变时,其值也为1
CF(进位标志):无符号整数溢出时,其值也被置为1。
0x4 指令指针寄存器
EIP:指令指针寄存器,保存着CPU要执行的指令地址,大小为32位。