当前位置:文档之家› 汇编寄存器功能详解

汇编寄存器功能详解

数据寄存器(AX、BX、CX、DX)1.寄存器AX通常称为累加器(Accumulator),用累加器进行的操作可能需要更少时间。

累加器可用于乘、除、输入/输出等操作,它们的使用频率很高;2.寄存器BX称为基地址寄存器(Base Register)。

它可作为存储器指针来使用;3.寄存器CX称为计数寄存器(Count Register)。

在循环和字符串操作时,要用它来控制循环次数;在位操作中,当移多位时,要用CL来指明移位的位数;4.寄存器DX称为数据寄存器(Data Register)。

在进行乘、除运算时,它可作为默认的操作数参与运算,也可用于存放I/O的端口地址;变址寄存器(SI、DI)寄存器SI和DI称为变址寄存器(Index Register),它们主要用于存放存储单元在段内的偏移量,用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便指针寄存器(BP、SP)寄存器BP和SP称为指针寄存器(Pointer Register),主要用于存放堆栈内存储单元的偏移量,用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。

指针寄存器不可分割成8位寄存器。

作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果。

它们主要用于访问堆栈内的存储单元,并且规定:BP为基指针(Base Pointer)寄存器,用它可直接存取堆栈中的数据;SP为堆栈指针(Stack Pointer)寄存器,用它只可访问栈顶段寄存器(CS、DS、ES、SS、FS、GS)段寄存器是根据内存分段的管理模式而设置的。

内存单元的物理地址由段寄存器的值和一个偏移量组合而成的,这样可用两个较少位数的值组合成一个可访问较大物理空间的内存地址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位CPU系统中,它共有6个段寄存器,所以,在此环境下开发的程序最多可同时访问6个段.指令指针寄存器指令指针EIP、IP(Instruction Pointer)是存放下次将要执行的指令在代码段的偏移量。

在具有预取指令功能的系统中,下次要执行的指令通常已被预取到指令队列中,除非发生转移情况。

所以,在理解它们的功能时,不考虑存在指令队列的情况。

16位标志寄存器9个标志位,它们主要用来反映CPU的状态和运算结果的特征。

1.进位标志CF(Carry Flag) 进位标志CF主要用来反映运算是否产生进位或借位。

如果运算结果的最高位产生了一个进位或借位,那么,其值为1,否则其值为0。

2.奇偶标志PF(Parity Flag)奇偶标志PF用于反映运算结果中“1”的个数的奇偶性。

如果“1”的个数为偶数,则PF的值为1,否则其值为03.辅助进位标志AF(Auxiliary Carry Flag) 在发生下列情况时,辅助进位标志AF的值被置为1,否则其值为0:(1)、在字操作时,发生低字节向高字节进位或借位时;(2)、在字节操作时,发生低4位向高4位进位或借位时。

4.零标志ZF(Zero Flag) 零标志ZF用来反映运算结果是否为0。

如果运算结果为0,则其值为1,否则其值为0。

在判断运算结果是否为0时,可使用此标志位5.符号标志SF(Sign Flag) 符号标志SF用来反映运算结果的符号位,它与运算结果的最高位相同。

在微机系统中,有符号数采用补码表示法,所以,SF也就反映运算结果的正负号。

运算结果为正数时,SF的值为0,否则其值为16.溢出标志OF(Overflow Flag) 溢出标志OF用于反映有符号数加减运算所得结果是否溢出。

如果运算结果超过当前运算位数所能表示的范围,则称为溢出,OF的值被置为1,否则,OF的值被清为0(“溢出”和“进位”是两个不同含义的概念)7.中断允许标志IF(Interrupt-enable Flag)中断允许标志IF是用来决定CPU是否响应CPU外部的可屏蔽中断发出的中断请求。

但不管该标志为何值,CPU都必须响应CPU外部的不可屏蔽中断所发出的中断请求,以及CPU内部产生的中断请求。

具体规定如下(1)、当IF=1时,CPU可以响应CPU外部的可屏蔽中断发出的中断请求;(2)、当IF=0时,CPU不响应CPU外部的可屏蔽中断发出的中断请求8.追踪标志TF(Trap Flag)当追踪标志TF被置为1时,CPU进入单步执行方式,即每执行一条指令,产生一个单步中断请求。

这种方式主要用于程序的调试。

9.方向标志DF(Direction Flag) 方向标志DF用来决定在串操作指令执行时有关指针寄存器发生调整的方向。

具体规定在第5.2.11节——字符串操作指令——中给出。

在微机的指令系统中,还提供了运算和逻辑运算结果的影响,后者受一些控制指令执行的影响16位微机的内存管理模式Intel公司的80X86系列的CPU基本上采用内存分段的管理模式。

它把内存和程序分成若干个段,每个段的起点用一个段寄存器来记忆,所以,学习微机汇编语言,必须要清楚地理解存储器的分段含义、存储单元的逻辑地址和其物理地址之间的转换关系我们知道:计算机的内存单元是以“字节”为最小单位进行线性编址的。

为了标识每个存储单元,就给每个存储单元规定一个编号,此编号就是该存储单元的物理地址存储单元的物理地址是一个无符号的二进制数。

但为了书写的简化,物理地址通常用十六进制来表示。

16位CPU内部有20根地址线,其编码区间为:00000H~0FFFFFH,所以,它可直接访问的物理空间为1M(220)字节。

而16位CPU内部存放存储单元偏移量的寄存器(如:IP、SP、BP、SI、DI和BX 等)都是16位,它们的编码范围仅为:00000H~0FFFFH。

这样,如果用16位寄存器来访问内存的话,则只能访问内存的最低端的64K,其它的内存将无法访问。

为了能用16位寄存器来有效地访问1M的存储空间,16位CPU采用了内存分段的管理模式,并引用段寄存器的概念。

16位微机把内存空间划分成若干个逻辑段,每个逻辑段的要求如下:逻辑段的起始地址(通常简称为:段地址)必须是16的倍数,即最低4位二进制必须全为0;逻辑段的最大容量为64K,这由16位寄存器的寻址空间所决定;按上述规定,1M内存最多可分成64K个段,即65536个段(段之间相互重叠),至少可分成16个相互不重叠的段。

物理地址的形成方式由于规定段地址必须是16的倍数,所以,其值的一般形式为:XXXX0H,即:前16位二进制位是变化的,后四位是固定为0。

鉴于段地址的这种特性,我们可以仅保存其前16位二进制来达到保存整个段地址,其后四位可通过“左移补0”来获得;在确定了某个存储单元所属的内存段后,我们也只知道其所处内存位置的范围,还不能确定其具体位置。

要想确定内存单元的具体位置,还必须知道该单元离该段地址有多远。

我们通常把存储单元的实际地址与其所在段的段地址之间的距离称为段内偏移,也可称为有效地址(EA—Effective Address)或偏移量(Offset)等。

有了段地址和偏移量,就能唯一地确定某一内存单元在存储器内的具体位置。

由此可见,存储单元的逻辑地址分为两部分:段地址和偏移量。

由逻辑地址得到其物理地址(PA—Physical Address)的计算方法如下:物理地址PA=段地址×16 + 偏移量对物理地址来说,当段地址变化时,只要对其偏移量进行相应的调整就可对应同一个物理地址,所以,同一个物理地址可有多个逻辑地址。

在汇编语言程序中,存储单元通常不是用其物理地址标识的,而是用其逻辑地址标识的。

逻辑地址的段地址由段寄存器给出,偏移量可由寄存器(SI、DI、BP和BX 等)给出,也可用符号地址或具体的数值给出。

段寄存器的引用段寄存器CS指向存放程序的内存段,IP是用来存放下条待执行的指令在该段的偏移量,把它们合在一起可在该内存段内取到下次要执行的指令。

段寄存器SS指向用于堆栈的内存段,SP是用来指向该堆栈的栈顶,把它们合在一起可访问栈顶单元。

另外,当偏移量用到了指针寄存器BP,则其缺省的段寄存器也是SS,并且用BP可访问整个堆栈,不仅仅是只访问栈顶。

段寄存器DS指向数据段,ES指向附加段,在存取操作数时,二者之一和一个偏移量合并就可得到存储单元的物理地址。

该偏移量可以是具体数值、符号地址和指针寄存器的值等之一,具体情况将由指令的寻址方式来决定。

通常,缺省的数据段寄存器是DS,只有一个例外,即:在进行串操作时,其目的地址的段寄存器规定为ES访问存储器方式缺省的段寄存器可选用的段寄存器偏移量取指令CS IP堆栈操作SS SP一般取操作数DS CS、ES、SS 有效地址串操作源操作数DS CS、ES、SS SI 目标操作数ES DI指针寄存器BP SS CS、DS、ES 有效地址段寄存器及其指针寄存器的引用关系:取指令所用的段寄存器和偏移量一定是用CS和IP堆栈操作所用的段寄存器和偏移量一定是SS和SP串操作的目标操作数所用的段寄存器和偏移量一定是ES和DI其它情况,段寄存器除了其默认引用的寄存器外,还可以强行改变为其它段寄存器汇编中寄存器的详解数据寄存器(AX、BX、CX和DX 16位EAX、EBX、ECX和EDX 32位)数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间。

32位CPU有4个32位的通用寄存器EAX、EBX、ECX和EDX。

对低16位数据的存取,不会影响高16位的数据。

这些低16位寄存器分别命名为:AX、BX、CX和DX,它和先前的16位CPU 中的寄存器相一致。

4个16位寄存器又可分割成8个独立的8位寄存器(AX:AH-AL、BX:BH-BL、CX:CH-CL、DX:DH-DL),每个寄存器都有自己的名称,可独立存取。

程序员可利用数据寄存器的这种“可分可合”的特性,灵活地处理字/字节的信息.寄存器AX和AL通常称为累加器(Accumulator),用累加器进行的操作可能需要更少时间。

累加器可用于乘、除、输入/输出等操作,它们的使用频率很高;寄存器BX称为基地址寄存器(Base Register)。

相关主题