汇编
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