当前位置: 首页 > news >正文

x86寄存器的一般功能

写在前面

本文打算对IA-32平台的常用寄存器做个总结,有的图片直接用的网上的,在此感谢前辈!

寄存器的分类

1、EAX, EBX, ECX, EDX都可以作为32位寄存器、16位寄存器或者8位寄存器使用。EAX可作为累加器用于乘法、除法及一些调整指令,对于这些指令,累加器常表现为隐含形 式。EAX寄存器也可以保存被访问存储器单元的偏移地址。EBX常用于地址指针,保存被访问存储器单元的偏移地址。ECX经常用作计数器,用于保存指令的 计数值。ECX寄存器也可以保存访问数据所在存储器单元的偏移地址。用于计数的指令包括重复的串指令、移位指令和循环指令。移位指令用CL计数,重复的串 指令用CX计数,循环指令用CX或ECX计数。EDX常与EAX配合,用于保存乘法形成的部分结果,或者除法操作前的被除数,它还可以保存寻址存储器数据。

2、EBP和ESP是32位寄存器,也可作为16位寄存器BP, SP使用,常用于椎栈操作。EDI和ESI常用于串操作,EDI用于寻址目标数据串,ESI用于寻址源数据串。

3、指令指针寄存器EIP(extra instruction pointer)存放指令的偏移地址。微处理器工作于实模式下,EIP是IP(16位)寄存器。80486 CPU工作于保护模式时EIP为32位寄存器。EIP总是指向程序的下一条指令(即EIP的内容自动加1,指向下一个存储单元)。EIP用于微处理器在程 序中顺序地寻址代码段内的下一条指令。当遇到跳转指令或调用指令时,指令指针寄存器的内容需要修改。

4、EFLAG 包括状态位、控制位和系统标志位,用于指示微处理器的状态并控制微处理器的操作。

5、① 代码段寄存器CS。代码段是一个用于保存微处理器程序代码(程序和过程)的存储区域。CS存放代码段的起始地址。在实模式下,它定义一个64KB存储器段 的起点。在保护模式下工作时,它选择一个描述符,这个描述符描述程序代码所在存储器单元的起始地址和长度。在保护模式下,代码段的长度为4GB。 
② 数据段寄存器DS。数据段是一个存储数据的存储区域,程序中使用的大部分数据都在数据段中。DS用于存放数据段的起始地址。可以通过偏移地址或者其他含有 偏移地址的寄存器,寻址数据段内的数据。在实模式下工作时,它定义一个64KB数据存储器段的起点。在保护模式下,数据段的长度为4GB。 
③ 堆栈段寄存器。堆栈段寄存器SS用于存放堆栈段的起始地址,堆栈指针寄存器ESP确定堆栈段内当前的入口地址。EBP寄存器也可以寻址堆栈段内的数据。 
④ 附加段寄存器ES。ES存放附加数据段的起始地址。常用于存放数据段的段基址或者在串操作中作为目标数据段的段基址。 
⑤ 附加段寄存器FS和GS。FS和GS是附加的数据段寄存器,作用与ES相同,以便允许程序访问两个附加的数据段。
在保护模式下,每个段寄存器都含有一个程序不可见区域。这些寄存器的程序不可见区域通常称为描述符的高速缓冲存储器(descriptor cache),因此它也是存储信息的小存储器。每个段寄存器对应8个字节的影子寄存器,用于存储段描述符。


Basic Program Execution Registers

先来看看intel官网手册中的图3-1,我们关注的是“Basic Program Execution Registers”。

文档中对“Basic Program Execution Registers”的简单描述如下:


由此可以看出,“Basic Program Execution Registers”由以下4部分组成:

通用寄存器(General-Purpose Registers):EAX,EBX,ECX,EDX,ESI,EDI,EBP,ESP

段寄存器(Segment Registers):CS,DS,SS,ES,FS,GS

EFLAGS寄存器(EFLAGS Register): EFLAGS

指令指针寄存器(EIP (Instruction Pointer Register)):EIP

在intel手册中专门有一张图如下:

Control registers
intel的5个控制寄存器(CR0,CR1,CR2,CR3,CR4)也是非常重要的,如果你自己写操作系统的话, 就会知道对它们的了解非常重要。主要是用来控制CPU的工作模式以及对当前任务的一些特性控制。

Memory management registers

内存管理寄存器也是非常重要,可以这么说,了解这个几个寄存器的用途,对于了解保护模式至关重要!分别为GDTR,IDRT,LDRT以及TR(task register)。

好,本文就关注这3类寄存器!

在文章《80386的寄存器组成》中也有一幅比较好的图,盗图如下:


接下来一一介绍!


Basic Program Execution Registers

首先来看8个通用寄存器


这八个寄存器的名称如下:EAX(累加器)、EBX(基址)、ECX(计数)、EDX(数据)、ESP(栈指针)、EBP(基址指针)、ESI(源变址)、EDI(目的变址)。

参考链接:

《80386的寄存器组成》

《80X86寄存器详解》

相关文章:

  • 简单的栈回溯 简单的栈回溯欺骗 -- 简单分析
  • Inline Assembly in GCC Vs VC++
  • The True Story of Hello World
  • Smallest x86 ELF Hello World
  • 使用vim编辑可执行文件--16进制模式
  • Understanding ELF using readelf and objdump
  • C语言字节对齐
  • C语言可变长参数函数与默认参数提升
  • Essential GNU Linker Concepts for Embedded Systems Programmers
  • A Sample Linker Script
  • Load-time relocation of shared libraries
  • Position Independent Code (PIC) in shared libraries
  • Position Independent Code (PIC) in shared libraries on x64
  • getchar()函数的思考与总结
  • sturct stat 结构体中 st_mode 的含义
  • 2018一半小结一波
  • Docker入门(二) - Dockerfile
  • exif信息对照
  • HomeBrew常规使用教程
  • IDEA常用插件整理
  • JavaScript HTML DOM
  • JavaScript中的对象个人分享
  • Java多线程(4):使用线程池执行定时任务
  • JS变量作用域
  • JWT究竟是什么呢?
  • Promise初体验
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • vuex 笔记整理
  • Vue组件定义
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 飞驰在Mesos的涡轮引擎上
  • 关于Android中设置闹钟的相对比较完善的解决方案
  • 力扣(LeetCode)21
  • 那些年我们用过的显示性能指标
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 实现简单的正则表达式引擎
  • 说说动画卡顿的解决方案
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • ​第20课 在Android Native开发中加入新的C++类
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • ​油烟净化器电源安全,保障健康餐饮生活
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • (转)fock函数详解
  • (转)四层和七层负载均衡的区别
  • ./indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object fil
  • .locked1、locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道
  • .NET应用架构设计:原则、模式与实践 目录预览
  • :not(:first-child)和:not(:last-child)的用法
  • @ResponseBody
  • @RunWith注解作用
  • [ IO.File ] FileSystemWatcher