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

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

基本程序运行寄存器

通用寄存器(General Purpose Registers ,32位,8个)

段寄存器(Segment Registers, 16位,6个)

程序状态与控制寄存器(Program Status and Control Registers ,32位,1个)

指令指针寄存器(Instruction Pointer ,32位,1个)

1.通用寄存器

通用寄存器是一种通用型的寄存器,用于传送和暂存数据,也可参与算数逻辑运算,并保存运算结果。IA-32中每个通用寄存器的大小都是32位,即4个字节,主要用来保存常量与地址等,由特定汇编指令操作特定寄存器。除常规用途外,某些寄存器还具有一些特殊功能:

EAX:(针对操作数和结果数据的)累加器

EBX:(DS段中的数据指针)基址寄存器

ECX:(字符串和循环操作的)计数器

EDX:(I/O指针)数据寄存器

以上4个寄存器主要用在算数运算(ADD、SUB、XOR、OR等)指令中,常常用来保存常量与变量的值。

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

注意:

编写Windows汇编程序时,Win32API函数在内部会使用ECX与EDX,调用这些API时,ECX与EDX的值就会改变。所以,ECX与EDX中保存有重要数据时,调用API前要先把这些数据备份到其他寄存器或栈。

通用寄存器中其他几个寄存器的名称如下所示。

EBP:(SS段中栈内数据指针)扩展基址指针寄存器<栈针>。

ESI:(字符串操作源指针)源变地寄存器。

EDI:(字符串操作目标指针)目的变址寄存器。

ESP:(SS段中栈指针)栈指针寄存器。

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

ESP只是栈区域的栈顶地址,某些指令(PUSH、POP、CALL、RET)可以直接用来操作ESP(栈区域管理是程序中相当重要的部分,不要把ESP用作其他用途)。

EBP表示栈区域的基地址,函数被调用时保存ESP的值,函数返回时再把值返回ESP。保证栈不会崩溃(这称为栈帧(Stack Frame)技术,它是代码逆向分析技术中的一个重要概念)ESI和EDI与特定指令(LODS、STOS、REP、MOVS等)一起使用,只要用于内存复制。

2.段寄存器

IA-32的保护模式中,段是一种内存保护技术,它把内存划分为多个区域,并为每个区域赋予其实地址、范围、访问权限等,以保护内存。此外,它还同分页技术一起用于将虚拟内存变更为实际物理内存。段内存记录在SDT中,而段寄存器就持有这些SDT的索引(index)。共6种寄存器,分别为CS、SS、DS、ES、FS、GS,每个寄存器的大小为16位,即2个字节。另外,每个段寄存器指向的段描述符与虚拟内存结合,形成一个线性地址(Linear Address),借助分页技术,线性地址最终被转换为实际的物理地址。

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

EFLAGS:Flag Register,标志寄存器

IA-32中标志寄存器的名称为EFLAGS,其大小为4个字节(32位),由原来的16位FLAGS寄存器扩展而来。

EFLAGS寄存器的每位都有意义,每位的值或为1或为0,代表On/Off或者True、False。其中有些位由系统直接设定,有些则根据程序命令的执行结果设置。

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等指令间接修改)。

5.IA-32寄存器的更多相关文章

  1. Tomcat Can't load AMD 64-bit .dll on a IA 32

    Java.lang.UnsatisfiedLinkError: C:\apache\apache-tomcat-7.0.14\bin\tcnative-1.dll: Can't load AMD 64 ...

  2. Tomcat:Can't load AMD 64-bit .dll on a IA 32 platform(问题记录)

    从报错看,这主要是应为64位-32位不兼容导致的.好在,在报此错的情况下,tomcat还是跑起来了. 具体来说,从网上搜索的一些资料来看,应该是jdk版本与tomcat不一致 .tomcat我的是64 ...

  3. 问题 Can't load AMD 64-bit .dll on a IA 32-bit platform

    问题简要描述: java.lang.UnsatisfiedLinkError: F:\Tools\tomcat6045\tomcat6.0.45_x64\apache-tomcat-6.0.45\bi ...

  4. 宽字符std::wstring的长度和大小问题?sizeof(std::wstring)是固定的32,说明std::wstring是一个普通的C++类,而且和Delphi不一样,没有负方向,因为那个需要编译器的支持

    std::wstring ws=L"kkkk";    int il=ws.length();    int ia=sizeof(ws);    int ib=sizeof(&qu ...

  5. idea 出现Can't load AMD 64-bit .dll on a IA 32-bit platform错误

    这个错误是在说无法在IA 32位平台上加载AMD 64位.dll,解决方法如下 下载安装64位的jdk(方法和安装32位的一致,可百度查阅相关资料) 按如下步骤配置

  6. 用户手册是Yasm汇编

    本文档的用户手册是Yasm汇编. 它是介绍和通用所有Yasm用户参考. 英文的参考:http://www.cnblogs.com/coryxie/p/3959888.html 1 .介绍 Yasm b ...

  7. 虚拟化技术实现 — KVM 的 CPU 虚拟化

    目录 文章目录 目录 前文列表 x86 体系结构的虚拟化 硬件辅助的 CPU 虚拟化 由 VMX 切换支撑的 CPU 虚拟化技术 KVM 的 CPU 虚拟化实现 vCPU 的调度方式 客户机 CPU ...

  8. X86中断/异常与APIC

    异常(exception)是由软件或硬件产生的,分为同步异常和异步异常.同步异常即CPU执行指令期间同步产生的异常,比如常见的除零错误.访问不在RAM中的内存 .MMU 发现当前虚拟地址没有对应的物理 ...

  9. STM32中断管理函数

    CM3 内核支持256 个中断,其中包含了16 个内核中断和240 个外部中断,并且具有256 级的可编程中断设置.但STM32 并没有使用CM3 内核的全部东西,而是只用了它的一部分. STM32 ...

  10. win7下安装tomcat

    安装个tomcat都一波三折,网上资料安装方法参差不齐,看多了反而晕,记录下自己安装的过程,便于以后翻阅. 选择哪个版本? tomcat 8要求JDK7以上, 想安装8的需要先确认下自己JDK版本(j ...

随机推荐

  1. 使用wireshark 抓取 http https tcp ip 协议进行学习

    使用wireshark 抓取 http https tcp ip 协议进行学习 前言 本节使用wireshark工具抓包学习tcp ip http 协议 1. tcp 1.1 tcp三次握手在wire ...

  2. LNMP配置——Nginx配置 —— Nginx解析PHP

    一.配置 #vi /usr/local/nginx/conf/vhost/test.com.conf 写入: server { listen 80; server_name test.com test ...

  3. Fisco bcos 区块链-分布式部署

    Fisco bcos 区块链-分布式部署 前置条件:mysql配置成功. 节点搭建 cat > ipconf << EOF 127.0.0.1:1 agencyA 1 127.0.0 ...

  4. Python3中变量作用域nonlocal的总结

    最近,在工作中踩到了一个关于Python3中nonlocal语句指定的变量作用域的坑.今天趁周六休息总结记录一下. 众所周知,Python中最常见的作用域定义如下:   但是,为了更加方便地在闭包函数 ...

  5. springboot 配置文件application

    application.properties # ----------------------------------------# 核心属性# --------------------------- ...

  6. 可视化运行Python的神器Jupyter Notebook

    目录 简介 Jupyter Notebook 启动notebook server notebook document 的结构 code cells markdown cells raw cells 以 ...

  7. 快速了解 JavaScript ES2019 的五个新增特性

    ES2019 规范是对 JavaScript 的一个较小的补充,但它仍然带来了一些有用的功能.本文将向你展示五个 ES2019 新增的特性,这些特性或许可以让你的编程轻松一点.这些特性包括 trimS ...

  8. 201871030116-李小龙 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告

    项目 内容 课程班级博客链接 https://edu.cnblogs.com/campus/xbsf/2018CST 这个作业要求链接 https://www.cnblogs.com/nwnu-dai ...

  9. UnitOneSummary

    目录 一.程序结构分析 第一次作业 第二次作业 第三次作业 二.Test & Bugs 三.设计模式 四.总结与反思 一.程序结构分析 第一次作业 思路: 1.输入预处理: 去除空格和\t 替 ...

  10. 一文带你更方便的控制 goroutine

    上一篇我们讲了 go-zero 中的并发工具包 core/syncx. 从整体分析来看,并发组件主要通过 channel + mutex 控制程序中协程之间沟通. Do not communicate ...