5.IA-32寄存器
寄存器(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寄存器的更多相关文章
- 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 ...
- Tomcat:Can't load AMD 64-bit .dll on a IA 32 platform(问题记录)
从报错看,这主要是应为64位-32位不兼容导致的.好在,在报此错的情况下,tomcat还是跑起来了. 具体来说,从网上搜索的一些资料来看,应该是jdk版本与tomcat不一致 .tomcat我的是64 ...
- 问题 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 ...
- 宽字符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 ...
- idea 出现Can't load AMD 64-bit .dll on a IA 32-bit platform错误
这个错误是在说无法在IA 32位平台上加载AMD 64位.dll,解决方法如下 下载安装64位的jdk(方法和安装32位的一致,可百度查阅相关资料) 按如下步骤配置
- 用户手册是Yasm汇编
本文档的用户手册是Yasm汇编. 它是介绍和通用所有Yasm用户参考. 英文的参考:http://www.cnblogs.com/coryxie/p/3959888.html 1 .介绍 Yasm b ...
- 虚拟化技术实现 — KVM 的 CPU 虚拟化
目录 文章目录 目录 前文列表 x86 体系结构的虚拟化 硬件辅助的 CPU 虚拟化 由 VMX 切换支撑的 CPU 虚拟化技术 KVM 的 CPU 虚拟化实现 vCPU 的调度方式 客户机 CPU ...
- X86中断/异常与APIC
异常(exception)是由软件或硬件产生的,分为同步异常和异步异常.同步异常即CPU执行指令期间同步产生的异常,比如常见的除零错误.访问不在RAM中的内存 .MMU 发现当前虚拟地址没有对应的物理 ...
- STM32中断管理函数
CM3 内核支持256 个中断,其中包含了16 个内核中断和240 个外部中断,并且具有256 级的可编程中断设置.但STM32 并没有使用CM3 内核的全部东西,而是只用了它的一部分. STM32 ...
- win7下安装tomcat
安装个tomcat都一波三折,网上资料安装方法参差不齐,看多了反而晕,记录下自己安装的过程,便于以后翻阅. 选择哪个版本? tomcat 8要求JDK7以上, 想安装8的需要先确认下自己JDK版本(j ...
随机推荐
- js--this指向的相关问题
前言 关于this的指向问题是前端面试中常考的知识点,也是我们开发学习中较难理解的问题.作为JavaScript的基础,需要我们彻底理解这一关键词.this作为JavaScript中非常复复杂的机制, ...
- MySQL基本指令3 和 索引 、分页
1视图: -创建 create view 视图名称 as SQL ps:虚拟 -修改 alter view 视图名称 as SQL -删除 drop view 视图名称 2触发器 3自定义函 ...
- C语言之三字棋的简单实现及扩展
C语言之三字棋的简单实现及扩展 在我们学习完数组之后,我们完全可以利用数组相关知识来写一个微小型的游戏,比如说今天所说的--三子棋. 大纲: 文件组成 实现 完整代码展示 扩展 即: 一.文件 ...
- Flink实时计算topN热榜
TopN的常见应用场景,最热商品购买量,最高人气作者的阅读量等等. 1. 用到的知识点 Flink创建kafka数据源: 基于 EventTime 处理,如何指定 Watermark: Flink中的 ...
- Sequelize 和 MySQL 对照Sequelize 和 MySQL 对照
安装 这篇文章主要使用MySQL.Sequelize.co来进行介绍.安装非常简单: $ npm install --save co $ npm install --save sequelize $ ...
- python graphviz的使用(画图工具)
参考文章1 参考文章2 一.graphviz安装及配置 graphviz实际上是一个绘图工具,可以根据dot脚本画出树形图等. 1.windows安装 安装graphviz软件:https://gra ...
- 使用 autofac 实现 asp .net core 的属性注入
使用 autofac 代替 asp .net core 默认的 IOC 容器,可实现属性注入. 之前的使用方式不受影响. 源码已开源: dotnet-campus/Autofac.Annotation ...
- Poj3660(floyd)
题目传送门 题意:编号为1-N的奶牛参加比赛,告诉我们m场比赛结果试问有几头奶牛的排名可以确定. 题解:其实就是一个传递闭包的模板题,用Floyd把所有有联系的比赛结果串在一起. Ac 代码: #in ...
- mongodb安装及常见命令操作
Mongodb是一个介于关系数据库和非关系数据库之间的产品(Nosql),是非关系数据库当中功能最丰富,最像关系数据库的,语法有点类似javascript面向对象的查询语言,它是一个面向集合的,模式自 ...
- Day2:Windows常用快捷键与基本的Dos命令
Windows常用快捷键 必须掌握: Ctrl+C:复制 Ctrl+V:粘贴 Ctrl+Z:撤销 Ctrl+S:保存 Win键+R:运行(run) alt+F4:关闭窗口/页面 Ctrl+A:全选 C ...