• 我们在哪一颗星上见过 ,以至如此相互思念 ;我们在哪一颗星上相互思念过,以至如此相互深爱
  • 我们在哪一颗星上分别 ,以至如此相互辉映 ;我们在哪一颗星上入睡 ,以至如此唤醒黎明
  • 认识世界 克服困难 洞悉所有 贴近生活 寻找珍爱 感受彼此

核心原理-第4章 IA-32寄存器基本讲解

逆向工程核心原理 云涯 5年前 (2019-08-31) 2068次浏览 0个评论

寄存器是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位。


云涯历险记 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:核心原理-第4章 IA-32寄存器基本讲解
喜欢 (0)

您必须 登录 才能发表评论!