汇编

CPU常见寄存器介绍 


32 位CPU 所含有的寄存器有:
 
4 个数据寄存器(EAX 、EBX 、ECX 和EDX)
2 个变址和指针寄存器(ESI 和 EDI) 2 个指针寄存器(ESP 和EBP) 
6 个段寄存器(ES 、CS 、SS 、DS 、FS 和GS)
1 个指令指针寄存器(EIP) 1 个标志寄存器(EFlags) 

1 、数据寄存器 

数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间。 

32 位CPU 有4 个32 位的通用寄存器EAX 、EBX 、ECX 和EDX 。对低16 位数据的存取,不会影响高16 位的数据。这些
低16 位寄存 器分别命名为:AX 、BX 、CX 和DX ,它和先前的CPU 中的寄存器相一致。 

4 个16 位寄存器又可分割成8 个独立的8 位寄存器(AX :AH-AL 、BX :BH-BL 、CX :CH-CL 、DX :DH-DL) ,每个寄
存 器都有自己的名称,可独立存取。程序员可利用数据寄存器的这种“ 可分可合” 的特性,灵活地处理字/ 字
节的信息。 

  寄存器AX 和AL 通常称为累加器(Accumulator) ,用累加器进行的操作可能需要更少时间。累加器可用于乘、
  除、输入/ 输出等 操作,它们的使用频率很高; 
  寄存器BX 称为基地址寄存器(Base Register) 。它可作为存储器指针来使用;  
  寄存器 CX 称为计数寄存器(Count Register) 。在循环和字符串操作时,要用它来控制循环次数;在位操作
  中,当移多位时,要用CL 来指明 移位的位数; 
  寄存器DX 称为数据寄存器(Data Register) 。在进行乘、除运算时,它可作为默认的操作数参与运算,也
  可 用于存放I/O 的端口地址。 


在16 位CPU 中,AX 、BX 、CX 和DX 不能作为基址和变址寄存器来存放存储单元的地址,但在32 位CPU 中,其32 位
寄存器 EAX 、EBX 、ECX 和EDX 不仅可传送数据、暂存数据保存算术逻辑运算结果,而且也可作为指针寄存器,
所以,这些32 位寄存器更具有通用性。 

2 、变址寄存器 

32 位CPU 有2 个32 位通用寄存器ESI 和EDI 。其低16 位对应先前CPU 中的SI 和DI ,对低16 位数据的存取,不影响
高16 位的数 据。 

寄存器ESI 、EDI 、SI 和DI 称为变址寄存器(Index Register) ,它们主要用于存放存储单元在段内的偏移量,
用它们可实 现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。 

变址寄存器不可分割成8 位寄存器。作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果。 

它们可作一般的存储器指针使用。在字符串操作指令的执行过程中,对它们有特定的要求,而且还具有特
殊的功能。 

3 、指针寄存器 

32 位CPU 有2 个32 位通用寄存器EBP 和ESP 。其低16 位对应先前CPU 中的SBP 和SP ,对低16 位数据的存取,不影
响高16 位的 数据。 

寄存器EBP 、ESP 、BP 和SP 称为指针寄存器(Pointer Register) ,主要用于存放堆栈内存储单元的偏移量,
用它们可实 现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。 

指针寄存器不可分割成8 位寄存器。作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果。 

它们主要用于访问堆栈内的存储单元,并且规定:
 
 BP 为基指针(Base Pointer) 寄存器,用它可直接存取堆栈中的数据; 
 SP 为堆栈指针(Stack Pointer) 寄存器,用它只可访问栈顶。 

4 、段寄存器 

段寄存器是根据内存分段的管理模式而设置的。内存单元的物理地址由段寄存器的值和一个偏移量组合而成
的,这样可用两个较少位数的值组合成一 个可访问较大物理空间的内存地址。 

CPU 内部的段寄存器:
 
 CS—— 代码段寄存器(Code Segment Register) ,其值为代码段的段值; 
 DS —— 数据段寄存器(Data Segment Register) ,其值为数据段的段值; 
 ES—— 附加段寄存器(Extra Segment Register) ,其值为附加数据段的段值; 
 SS—— 堆栈段寄存器(Stack Segment Register) ,其值为堆栈段的段值; 
 FS—— 附加段寄存器(Extra Segment Register) ,其值为附加数据段的段值; 
 GS—— 附加段寄存器(Extra Segment Register) ,其值为附加数据段的段值。 

在16 位CPU 系统中,它只有4 个段寄存器,所以,程序在任何时刻至多有4 个正在使用的段可直接访问;在32 位
微机系统中,它有6 个段寄存 器,所以,在此环境下开发的程序最多可同时访问6 个段。 

32 位CPU 有两个不同的工作方式:实方式和保护方式。在每种方式下,段寄存器的作用是不同的。有关规定简
单描述如下: 

实方式: 前4 个段寄存器CS 、DS 、ES 和SS 与先前CPU 中的所对应的段寄存器的含义完全一致,内存单元的逻辑
地址仍为“ 段值:偏移 量” 的形式。为访问某内存段内的数据,必须使用该段寄存器和存储单元的偏移量。 
保护方式: 在此方式下,情况要复杂得多,装入段寄存器的不再是段值,而是称为“ 选择子”(Selector) 的某个值。。 

5 、指令指针寄存器 

32 位CPU 把指令指针扩展到32 位,并记作EIP ,EIP 的低16 位与先前CPU 中的IP 作用相同。 

指令指针EIP 、IP(Instruction Pointer) 是存放下次将要执行的指令在代码段的偏移量。在具有预取指令功
能的系统 中,下次要执行的指令通常已被预取到指令队列中,除非发生转移情况。所以,在理解它们的功能
时,不考虑存在指令队列的情况。 

在实方式下,由于每个段的最大范围为64K ,所以,EIP 中的高16 位肯定都为0 ,此时,相当于只用其低16 位
的IP 来反映程序中指令的执 行次序。 

6 、标志寄存器 

一、运算结果标志位
1 、进位标志CF(Carry Flag)
进位标志CF 主要用来反映运算是否产生进位或借位。如果运算结果的最 高位产生了一个进位或借位,那么,其值为1 ,否则其值为0 。 

使用该标志位的情况有:多字( 字节) 数的加减运算,无符号数的大小比较运算,移位操作,字( 字节) 之间移位,专门改变CF 值的指令等。 

2 、奇偶标志PF(Parity Flag)
奇偶标志PF 用于反映运算结果中“1” 的个数的奇偶性。如果“1” 的个数为偶数,则PF 的值为 1 ,否则其值为0 。 

利用PF 可进行奇偶校验检查,或产生奇偶校验位。在数据传送过程中,为了提供传送的可靠性,如果采用奇偶校验的方法,就可使用该标志位。 

3 、辅助进位标志AF(Auxiliary Carry Flag)
在发生下列情况时,辅助进位标志AF 的值被置为1 ,否则其值为0 : 

(1) 、在字操作时,发生低字节向高字节进位或借位时;
(2) 、在字节操作时,发生低4 位向高4 位进位或借位时。 

对以上6 个运算结果标志位,在一般编程情况下,标志位CF 、ZF 、SF 和OF 的使用频率较高,而标志位PF 和AF 的使用频率较低。 

4 、零标志ZF(Zero Flag)
零标志ZF 用来反映运算结果是否为0 。如果运算结果为0 ,则其值为1 ,否则其值为0 。在判断运算结果是否为0 时,可使用此标志位。 

5 、符号标志SF(Sign Flag)
符号标志SF 用来反映运算结果的符号位,它与运算结果的最高位相同。在微机系统中,有符号数采用补 码表示法,所以,SF 也就反映运算结果的正负号。运算结果为正数时,SF 的值为0 ,否则其值为1 。 

6 、溢出标志OF(Overflow Flag)
溢出标志OF 用于反映有符号数加减运算所得结果是否溢出。如果运算结果超过当前运算位数所 能表示的范围,则称为溢出,OF 的值被置为1 ,否则,OF 的值被清为0 。 

“ 溢出” 和“ 进位” 是两个不同含义的概念,不要混淆。如果不太清楚的话,请查阅《计算机组成原理》课程中的有关章节。 

二、状态控制标志位
状态控制标志位是用来控制CPU 操作的,它们要通过专门的指令才能使之发生改变。 

1 、追踪标志TF(Trap Flag)
当追踪标志TF 被置为1 时,CPU 进入单步执行方式,即每执行一条指令,产生一个单步中断请求。这 种方式主要用于程序的调试。 

指令系统中没有专门的指令来改变标志位TF 的值,但程序员可用其它办法来改变其值。 

2 、中断允许标志IF(Interrupt-enable Flag)
中断允许标志IF 是用来决定CPU 是否响应CPU 外部的可屏蔽中断发 出的中断请求。但不管该标志为何值,CPU 都必须响应CPU 外部的不可屏蔽中断所发出的中断请求,以及CPU 内部产生的中断请求。具体规定如下: 

(1) 、当IF=1 时,CPU 可以响应CPU 外部的可屏蔽中断发出的中断请求; 

(2) 、当IF=0 时,CPU 不响应CPU 外部的可屏蔽中断发出的中断请求。 

CPU 的指令系统中也有专门的指令来改变标志位IF 的值。 

3 、方向标志DF(Direction Flag)
方向标志DF 用来决定在串操作指令执行时有关指针寄存器发生调整的方向。具体规定在第 5.2.11 节—— 字符串操作指令—— 中给出。在微机的指令系统中,还提供了专门的指令来改变标志位DF 的值。 

三、32 位标志寄存器增加的标志位
1 、I/O 特权标志IOPL(I/O Privilege Level)
I/O 特权标志用两位二 进制位来表示,也称为I/O 特权级字段。该字段指定了要求执行I/O 指令的特权级。如果当前的特权级别在数值上小于等于IOPL 的值,那么,该I/O 指令 可执行,否则将发生一个保护异常。 

2 、嵌套任务标志NT(Nested Task)
嵌套任务标志NT 用来控制中断返回指令IRET 的执行。具体规定如下: 

(1) 、当NT=0 ,用堆栈中保存的值恢复EFLAGS 、CS 和EIP ,执行常规的中断返回操作; 

(2) 、当NT=1 ,通过任务转换实现中断返回。 

3 、重启动标志RF(Restart Flag)
重启动标志RF 用来控制是否接受调试故障。规定:RF=0 时,表示“ 接受” 调试故障,否则 拒绝之。在成功执行完一条指令后,处理机把RF 置为0 ,当接受到一个非调试故障时,处理机就把它置为1 。 

4 、虚拟8086 方式标志VM(Virtual 8086 Mode)
如果该标志的值为1 ,则表示处理机处于虚拟的8086 方式下的工作状态,否则,处理机处于一般保护方式下的工作状态。

常见的基本汇编书籍 

Windows.环境下32位汇编语言程序设计(第2版) 
http://www.happycampus.cn/docs/957100583237@hc10/275980/ 

汇编语言编程艺术 

Intel汇编语言程序设计(第四版) 

Intel汇编语言程序设计(第五版)范例 
http://download.csdn.net/source/1523425 

80x86汇编语言程序设计教程 
http://www.happycampus.cn/docs/957100583237@hc10/275982/ 

IBM.PC.汇编语言程序设计(第五版) 
http://www.happycampus.cn/docs/957100583237@hc10/275981/ 

Microsoft MASM 手册 
http://download.csdn.net/source/1592857 
--------------------------------------------------------------------------------
汇编编译器 

MASM32 
http://www.masm32.com/masmdl.htm

MASM6.0 
http://cid-6107b2426ac9abb3.skydrive.live.com/self.aspx/NamipanPublic/2009-07-08/MASM6.0.rar

NASM-Win32 
http://www.nasm.us/pub/nasm/releasebuilds/2.08rc7/win32/nasm-2.08rc7-win32.zip 

NASM-DOS 
http://www.nasm.us/pub/nasm/releasebuilds/2.08rc7/dos/nasm-2.08rc7-dos.zip 

NASM-Linux 
http://www.nasm.us/pub/nasm/releasebuilds/2.08rc7/linux/ 

TASM5.0 

简易MASM附带Turbo Debugger http://download.csdn.net/source/2036190 

Windows 环境下编写汇编程序的工具 http://download.csdn.net/source/1513555 

--------------------------------------------------------------------------------
汇编语言网站 

编程中国 >> 技术教程 >> 开发语言 >> 汇编
http://www.bccn.net/Article/kfyy/hb/ 

汇编网 
http://www.asmedu.net/ 

80x86 汇编小站 
www.x86asm.com/ 

AoGo 汇编小站 
http://www.aogosoft.com/ 

Assembly Language for Intel-Based Computers 
http://kipirvine.com/asm/ 

NASM 
http://www.nasm.us/ 

Assembly Language Programming - MASM & Intel Docs 
http://web.sau.edu/LillisKevinM/csci240/masmdocs/ 

--------------------------------------------------------------------------------
。 一些博客帖子 

自己写的一个汇编计算器 
http://blog.csdn.net/KingWolfOfSky/archive/2009/11/11/4800028.aspx

Linux 汇编语言开发指南 
http://blog.csdn.net/KingWolfOfSky/archive/2009/08/09/4427623.aspx

创 建Win32 图形界面应用程序 
http://blog.csdn.net/KingWolfOfSky/archive/2009/08/07/4423958.aspx

架 设WIN32 汇编程序的开发环境 
http://blog.csdn.net/KingWolfOfSky/archive/2009/07/23/4375411.aspx

汇编初学者问题合集 
http://blog.csdn.net/mydo/archive/2007/09/07/1776304.aspx 

[ 幽默机智问答] 汇编系列,给初学者 
http://topic.csdn.net/u/20080423/21/e1fa715d-9613-4b8d-aa69-58b6f95be894.html 

 


从汇编分析Win32 消息原理 
http://coderarea.net/html/bianchengyuyan/huibianyuyan/huibianyingyong/2009/0316/74531.html 

用汇编写特殊要求的strlen 
http://coderarea.net/html/bianchengyuyan/huibianyuyan/huibianyingyong/2009/0316/74530.html 

8051 存储器 
http://coderarea.net/html/bianchengyuyan/huibianyuyan/huibianshili/2009/0316/74495.html 

8051 寻址方式 
http://coderarea.net/html/bianchengyuyan/huibianyuyan/huibianshili/2009/0316/74494.html 

GCC 内联汇编基础 
http://coderarea.net/html/bianchengyuyan/huibianyuyan/huibianshili/2009/0316/74493.html 

汇编的角度来理解数组与指针 
http://coderarea.net/html/bianchengyuyan/huibianyuyan/huibianrumen/2009/0316/74390.html 

从汇编语言翻译到c 语言代码 
http://coderarea.net/html/bianchengyuyan/huibianyuyan/huibianshili/2009/0316/74492.html 

函数调用得到传递参数的想法 
http://coderarea.net/html/bianchengyuyan/huibianyuyan/huibianshili/2009/0316/74491.html 

汇编语言写ESMTP 电子邮件发送程序 
http://coderarea.net/html/bianchengyuyan/huibianyuyan/huibianyingyong/2009/0316/74529.html 

使用Mutex 防止程序运行两次 
http://coderarea.net/html/bianchengyuyan/huibianyuyan/huibianshili/2009/0316/74489.html 

汇编开发的进制输出的程序 
http://coderarea.net/html/bianchengyuyan/huibianyuyan/huibianyingyong/2009/0316/74528.html 

汇编实现:接受一个小写字母输出对应大写字母 
http://coderarea.net/html/bianchengyuyan/huibianyuyan/huibianshili/2009/0316/74488.html 

接受一个小写字母,找出前个字符和后续字符 
http://coderarea.net/html/bianchengyuyan/huibianyuyan/huibianshili/2009/0316/74487.html 

汇编排序& 查找实例 
http://coderarea.net/html/bianchengyuyan/huibianyuyan/huibianshili/2009/0316/74486.html 

16 位数拆分为4 组实例代码 
http://coderarea.net/html/bianchengyuyan/huibianyuyan/huibianshili/2009/0316/74485.html 

不定参函数实现方法 
http://coderarea.net/html/bianchengyuyan/huibianyuyan/huibianrumen/2009/0316/74389.html 

反汇编破解Radmin 密码实例 
http://coderarea.net/html/bianchengyuyan/huibianyuyan/huibianshili/2009/0316/74484.html 

对话框代码模块源码( 汇编) 
http://coderarea.net/html/bianchengyuyan/huibianyuyan/huibianyuanma/2009/0316/74555.html 

MASM32 编程读取网站首页代码 
http://coderarea.net/html/bianchengyuyan/huibianyuyan/huibianyuanma/2009/0316/74554.html 

Win32 汇编读者/ 写者,写者具有优先权的问题 
http://coderarea.net/html/bianchengyuyan/huibianyuyan/huibianrumen/2009/0316/74387.html 

汇编程序在屏幕显示字符的源代码 
http://coderarea.net/html/bianchengyuyan/huibianyuyan/huibianyuanma/2009/0316/74553.html 

echo 命令基础 
http://coderarea.net/html/bianchengyuyan/huibianyuyan/huibianrumen/2009/0316/74377.html 

”VB“ 版的汇编环境的配置方法 
http://coderarea.net/html/bianchengyuyan/huibianyuyan/huibianyingyong/2009/0316/74527.html 

程序转移指令 
http://coderarea.net/html/bianchengyuyan/huibianyuyan/huibianrumen/2009/0316/74376.html 

汇编语言串指令 
http://coderarea.net/html/bianchengyuyan/huibianyuyan/huibianrumen/2009/0316/74375.html 

汇编语言逻辑运算指令 
http://coderarea.net/html/bianchengyuyan/huibianyuyan/huibianrumen/2009/0316/74374.html 

汇编语言算术运算指令 
http://coderarea.net/html/bianchengyuyan/huibianyuyan/huibianrumen/2009/0316/74373.html 

常见修改( 机器码) 
http://coderarea.net/html/bianchengyuyan/huibianyuyan/huibianrumen/2009/0316/74372.html 

需要熟练掌握的全部汇编知识 
http://coderarea.net/html/bianchengyuyan/huibianyuyan/huibianrumen/2009/0316/74371.html 

汇编语言经典句式 
http://coderarea.net/html/bianchengyuyan/huibianyuyan/huibianrumen/2009/0316/74370.html 

断点设置表 
http://coderarea.net/html/bianchengyuyan/huibianyuyan/huibianrumen/2009/0316/74369.html 

汇编基础资料速查 
http://coderarea.net/html/bianchengyuyan/huibianyuyan/huibianshili/2009/0316/74478.html 

用内联汇编判断整数计算是否产生进位借位或溢出 
http://coderarea.net/html/bianchengyuyan/huibianyuyan/huibianshili/2009/0316/74477.html 

泛型类型的子类及通配符的使用 
http://coderarea.net/html/bianchengyuyan/huibianyuyan/huibianrumen/2009/0316/74368.html 

win32 下使用内存映射文件 
http://coderarea.net/html/bianchengyuyan/huibianyuyan/huibianrumen/2009/0316/74367.html 

直接系统服务(Direct System Service) 
http://coderarea.net/html/bianchengyuyan/huibianyuyan/huibianrumen/2009/0316/74366.html 

时钟服务(Clock Service——INT 1AH) 
http://coderarea.net/html/bianchengyuyan/huibianyuyan/huibianrumen/2009/0316/74365.html 

并行口服务(Parallel Port Service——INT 17H) 
http://coderarea.net/html/bianchengyuyan/huibianyuyan/huibianrumen/2009/0316/74364.html 

键盘服务(Keyboard Service——INT 16H) 
http://coderarea.net/html/bianchengyuyan/huibianyuyan/huibianrumen/2009/0316/74363.html 

杂项系统服务(Miscellaneous System Service——INT 
http://coderarea.net/html/bianchengyuyan/huibianyuyan/huibianrumen/2009/0316/74362.html 

串行口服务(Serial Port Service——INT 14H) 
http://coderarea.net/html/bianchengyuyan/huibianyuyan/huibianrumen/2009/0316/74361.html 

直接磁盘服务(Direct Disk Service——INT 13H) 
http://coderarea.net/html/bianchengyuyan/huibianyuyan/huibianrumen/2009/0316/74360.html 

显示服务(Video Service——INT 10H) 
http://coderarea.net/html/bianchengyuyan/huibianyuyan/huibianrumen/2009/0316/74359.html 

其它DOS 中断 
http://coderarea.net/html/bianchengyuyan/huibianyuyan/huibianrumen/2009/0316/74358.html 

太多了,贴的好累,大家有空去踩踩吧~~
http://blog.csdn.net/KingWolfOfSky/archive/2010/02/09/5303757.aspx

 

posted @ 2013-08-16 02:56  herizai007  阅读(508)  评论(0编辑  收藏  举报