问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

IA-32寄存器基本讲解

创作时间:
作者:
@小白创作中心

IA-32寄存器基本讲解

引用
CSDN
1.
https://m.blog.csdn.net/weixin_43905689/article/details/145399019

IA-32架构是英特尔推出的32位元架构,属于复杂的指令集架构,它提供了非常丰富的功能,并且支持多种寄存器。本文将详细介绍IA-32架构中的各种寄存器类型及其功能。

什么是CPU寄存器

寄存器是CPU内部用来存放数据的一些小型存储区域,它与我们常说的RAM(Random Access Memory,随机存储器、内存)略有不同。CPU访问RAM中的数据时要经过较长的物理路径,所以花费的时间要长一些;而寄存器集成在CPU内部,拥有非常高的读写速度。

IA-32寄存器

IA-32是英特尔推出的32位元架构,属于复杂的指令集架构,它提供了非常丰富的功能,并且支持多种寄存器。下面列出IA-32支持的寄存器类型。

  
IA32寄存器类型
Basic program execution registers
x87 FPU registers
MMX registers
XMM registers
Control registers
Memory management registers
Debug registers
Memory type range registers
Machine specific registers
Machine check registers
......
  

以上寄存器列表中,我们要先学习基本程序运行寄存器的相关内容

基本程序运行寄存器

  • 通用寄存器(General Purpose Registers,32位,8个)
  • 段寄存器(Segment Registers,16位,6个)
  • 程序状态与控制寄存器(Program Status and Control Registers,32位,1个)
  • 指令指针寄存器(Instruction Pointer,32位,1个)

在寄存器名称缩略语之前添加字母E(Extended,扩展),表示该寄存器在16位CPU(IA-16)时就已经存在,并且其大小在IA-32下由原16位扩展为32位。

下面分别介绍一下各种寄存器。

1.通用寄存器

顾名思义,通用寄存器是一种通用型的寄存器,用于传送和暂存数据,也可参与算术逻辑运算,并保存运算结果。IA-32中每个通用寄存器的大小都是32位,即4个字节,主要用来保存常量与地址等,由特定汇编指令来操作特定寄存器。

为了实现对低16位的兼容,各寄存器又可以分为高(H:High)、低(L:Low)几个独立寄存器。下面以EAX为例讲解。

  • EAX:(0~31)32位
  • AX:(0~15)EAX的低16位
  • AH:(8~15)AX的高8位
  • AL:(0~7)AX的低8位

若想要全部使用4个字节(32位),则使用EAX;若只想使用2个字节(16位),只要使用EAX的低16位部分AX就可以了。AX又分为高8位的AH与低8位的AL两个独立寄存器。

各寄存器的名称如下所示

  • EAX:(针对操作数和结果数据的)累加器
  • EBX:(DS段中的数据指针)基址寄存器
  • ECX:(字符串和循环操作的)计数器
  • EDX:(I/O指针)数据寄存器

以上4个寄存器主要用于算术运算(ADD SUB XOR OR等)指令中,常用来保存常量与变量的值。某些汇编指令(MUL DIV LODS等)直接用来操作特定寄存器,执行这些指令后,仅改变特定寄存器中的值。

此外,ECX与EAX也可以用于特殊用途。循环命令(LOOP)中,ECX用来循环计数,没执行一次循环,ECX都会减1.EAX一般用在函数返回值中,所有win32 API函数都会先把返回值保存到EAX再返回。

  • EBP:(SS段中栈内数据指针)扩展基址指针寄存器
  • ESI:(字符串操作源指针)源变址寄存器
  • EDI:(字符串操作目标指针)目的变址寄存器
  • ESP:(SS段中栈指针)栈指针寄存器

以上4个寄存器主要用作保存内存地址的指针

ESP指示栈区域的栈顶地址,某些指令(PUSH POP CALL RET)可以直接用来操作ESP

EBP表示栈区域的基地址,函数被调用时保存ESP的值,函数返回时再把值返回ESP,保证栈不会崩溃

ESI和EDI与特定指令(LODS STOS REP MOVS等)一起使用,主要用于内存复制

2.段寄存器

段(Segment)这一术语来自IA-32的内存管理模型。

IA-32的保护模式中,段是一种内存保护技术,他把内存划分为多个区段,并为每个区段赋予起始地址、范围、访问权限等,以保护内存。此外,他还同分页技术(Paging)一起用于将虚拟内存变更为实际物理内存。段内存记录在SDT(Segment Descriptor Table,段描述符表)中,而段寄存器就持有这些SDT的索引(index)。

段寄存器总共由6中寄存器组成,分别为CS SS DS ES FS GS,每个寄存器的大小为16位,即2个字节。另外每个段寄存器指向的段描述符与虚拟内存结合,形成一个线性地址,借助分页技术,线性地址最终被转换为实际的物理地址。

  • CS:Code Segment 代码段寄存器
  • SS:Stack Segment 栈段寄存器
  • DS:Data Segment 数据段寄存器
  • ES:Extra(Data)Segment 附加(数据)段寄存器
  • FS:Data Segment 数据段寄存器
  • GS:Data Segment 数据段寄存器

CS寄存器用于存放应用程序代码所在段的段基址,SS寄存器用于存放栈段的段基址,DS寄存器用于存放数据段的段基址。ES FS GS寄存器用来存放程序使用的附加数据段的段基址。

程序调试中会经常用到FS寄存器,它用于计算SEH(结构化异常处理机制)、TEB(线程环境块)、PEB(进程环境块)等地址,这些都属于高级调试技术。

3.程序状态与控制寄存器

  • EFLAGS:Flag Register 标志寄存器

IA-32中标志寄存器的名称为EFLAGS,其大小为4个字节(32位),由原来的16位FLAGS寄存器扩展而来。EFLAGS寄存器的每个位都有意义,每位的值或为1或为0,代表On/Off或True/False。其中有些位由系统直接设定,有些位则根据程序命令的执行结果设置。

EFLAGS寄存器共有32个位元,我们只需要重点关注3个即可,分别位ZF(Zero Flag,零标志)、OF(Overflow Flag,溢出标志)、CF(Carry Flag,进位标志)

以上3个标志之所以重要,是因为在某些汇编指令,特别是Jcc(条件跳转)指令中要检查这3个标志的值,并根据他们的值决定是否执行某个动作

  • ZF

若运算结果为0,则其值为1,否则为0

  • OF

有符号整数溢出时,OF值为1;此外MSB改变时,其值也被设为1

  • CF

无符号整数溢出时,其值为1

4.指令指针寄存器

  • EIP:Instruction Pointer 指令指针寄存器

指令指针寄存器保存着CPU要执行的指令地址,其大小为32位(4个字节),由原16位IP寄存器扩展而来。程序运行时,CPU会读取EIP中一条指令的地址,传送指令到指令缓冲区后,EIP寄存器的值自动增长,增加的大小既是读取指令的字节大小。这样,CPU每次执行完一条指令,就会通过EIP寄存器读取并指令下一条指令。

与通用寄存器不同,我们不能直接修改EIP的值,只能通过其他指令间接修改,这些特定指令包括JMP JCC CALL RET。此外,我们还可以通过中断或者异常来修改EIP的值

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号