【汇编语言/底层开发】11、标识寄存器

除了前述的多种具有特定用途的寄存器之外,8086的CPU中还存在一类特殊的寄存器,称为标识寄存器flag,其每一位可能用来存储特定的信息,主要有以下三类:

(1)相关指令的某些执行结果;

(2)为CPU执行相关指令提供依据;

(3)控制CPU的相关工作方式。

在这个16位的寄存器中,共有9个bit位被用作某种标识位,其他几个bit为保留位,没有实际意义。以下几节中将浏览其中几个标志位的作用和使用方法。

1、ZF标识:

ZF标识位为flag的第六位,其含义为0标识位。当某条汇编指令完成后,结果为0,则ZF==1;否则,ZF==0。

2、PF标识:

PF标识位为flag的第二位,其含义为奇偶标识位,表示该指令的执行结果中非零位的个数是否为偶数。结果中有偶数个1,则PF==1;否则,PF==0。

3、SF标识:

SF标识位为flag的第七位,其含义为结果是否为负数。SF命名中的S(sign)可以认为是负号(-)的含义,若结果为负,SF==1;若结果为正,SF==0。

4、CF标识:

CF标识位为flag的第0位,其含义为进位标识位。该标识位仅仅对无符号数运算有意义。在进行N位无符号数运算时,若运算结果过大,N位无符号数无法保存产生进位,或者运算结果小于0产生了借位,在某条指令存在进位或借位的情况下,CF==1;否则,CF==0;

5、OF标识:

OF标识位为flag的第11位,其含义为溢出标识位,O即溢出(Overflow)的含义。该标识位仅仅对有符号数运算有意义。对于有符号数的溢出,简单理解即为:由于有符号数的最高位为符号位,这样就可能产生两个正数相加,最高位表示正号的0被后面的1覆盖变成了负数,或者两个负数相加,由于借位的缘故导致表示负号的1变成了0。若某条指令运行过程中没有发生溢出,OF==0;若出现溢出,OF==1;

6、abc指令

abc指令实现的是带进位的加法功能,其调用方式同不带进位的加法指令add类似:

abc oprand1, oprand2

该指令的同add的不同之处在于,其结果相当于add的结果加上CF标识位的值。add指令和adc指令配合,可以实现对更大的数据进行加法运算。

7、sbb指令

与abc指令类似,sbb指令实现的是带借位的减法。

sbb oprand1, oprand2

该指令的意义:oprand1 = oprand1 - oprand2 -CF。

8、cmp指令

cmp指令实现比较功能,相当于不保存结果的减法指令。该指令执行后会影响标识寄存器,并通过标识寄存器支持其他指令来获取比较结果。使用方式为:

cmp ax, bx

若指令执行后zf=0,那么可以判断二者是否相等;cf为1说明ax<bx,反之ax>bx。

对于有符号数,两个操作数相减可能产生负值,使得sf=0,此时需要根据of所指示的溢出情况来判断大小。若of=0说明没有出现溢出,则sf所标识的正负值正确表示了两个操作数的差值符号;若of=1,则说明出现了溢出,两个操作数差的正负值情况同sf标识的相反。

9、检测比较结果的条件转移指令

以下几条指令可以同cmp配合,实现根据两个操作数大小关系而进行跳转。假设前一条指令为cmp ax, bx。

je——ax==bx的时候进行跳转;

jne——ax!=bx的时候进行跳转;

jb——ax<bx的时候进行跳转;

jnb——ax>=bx的时候进行跳转;

ja——ax>bx的时候进行跳转;

jna——ax<=bx的时候进行跳转。

10、DF标识和串传送指令

方向标识位DF是flag寄存器的第10位,其作用是控制每次操作之后si和di的增减。当DF=0时,每次操作si和di递增,反之si和di递减。

串传送指令movsb和movesw的作用为串数据传送,前者传输字节型数据,后者传输字型数据。这两个指令的用法通常为:首先指定ds和es的值,然后使用这两个数据将ds:si中的数据按字节或字送入es:di中,然后将si和di递增1或2。该指令通常同寄存器cx和rep配合,实现对一段内存中数据的传递。

11、pushf和popf

这两个指令提供了直接访问标识寄存器的方法,前者的功能是将标识寄存器压栈,后者的功能是从栈中将数据弹出,赋予标识寄存器。

时间: 2024-12-31 20:00:20

【汇编语言/底层开发】11、标识寄存器的相关文章

【汇编语言/底层开发】2、CPU的寄存器

寄存器是CPU中用于高速存取暂存数据的存储部件.通过改变寄存器中的数据,可以对CPU的行为进行控制.对于8086CPU,内部共有14个寄存器,位宽均为16位,分别是AX, BX, CX, DX, SI, DI, SP, BP, IP, CS, SS, DS, ES, PSW.不同的寄存器所起到的作用不同. 1.通用寄存器       通用寄存器指的是AX, BX, CX, DX四个寄存器,可以用于存放通用数据.每一个通用寄存器可以存放16位数据,而由于上一代CPU的寄存器为8位,考虑到兼容性,每

【汇编语言/底层开发】3、通过寄存器进行内存访问

上篇叙述了8086CPU的通用寄存器和代码寄存器的一些东西.仅仅这些是远远不够的,显而易见的一个原因是,如果CPU只是对自己内部的寄存器进行操作,不能同外部数据进行交互,那么将无法完成任何工作. 数据段寄存器DS: 8086CPU中的DS寄存器专门用来存放准备访问的数据的段地址.[n]则表示一个偏移地址,这个偏移地址同DS中表示的段地址一起确定最终要访问的内存地址. 以下汇编语句表示从10000H地址中的数据读入寄存器AL中: MOV BX, 1000 MOV DS, BX MOV AL, [0

【汇编语言/底层开发】5、[BX]和loop指令

1.[bx] 在之前编写的汇编代码中,我们经常使用到[0].[1]等标志,方括号中的数字表示某个偏移地址,该地址同段地址一起表示某个内存的位置.但是,在实际应用中存在一个问题,masm等编译器实际上不支持[n]这样的写法,在代码中的[1].[2]实际上会被处理成1.2等数字型常量,而不是我们希望的偏移地址. 为了解决这个问题,汇编语言中定义了[bx]的写法.bx中存放的数据被当做是一个偏移地址,相应的段地址保存于寄存器DS,二者共同构成一个内存中的实际地址.使用方式如下: mov ax, [bx

【汇编语言/底层开发】9、转移指令的原理

可以修改IP或者同时修改CS和IP的指令统称为转移指令.转移指令控制CPU执行内存中某处的代码,其作用相当于C语言中的GOTO.在C语言中并不鼓励使用goto语句,但是在汇编语言中由于没有复杂的流程控制运算符,使用转移指令称为必然.在8086中,转移指令可分为以下几类:(1)无条件转移指令:(2)条件转移指令:(3)循环指令:(4)过程:(5)中断. 1.操作符Offset: 操作符offset是由编译器处理的符号,功能是取得标号所在的偏移地址. 2.jmp指令: jmp为无条件跳转指令,可以修

【汇编语言/底层开发】6、程序中包含多个segment

众所周知的是,我们所开发的应用程序需依赖于操作系统运行,因此应用程序所使用的内存空间必须是安全的,不能与操作系统和其他应用程序相重合.因此,应用程序所需要的空间应当通过操作系统申请.对于我们使用汇编语言开发的程序而言,可以通过在源程序中定义段来获取内存空间. 1.在代码段中定义数据 在编写汇编程序时,可以直接在代码段中对数据进行定义.使用dw可以定义若干个字型数据,每个数据占据两个字节.但是由此带来的问题就是,代码段中的所有数据在运行时都会当做指令代码进行处理,因此我们使用dw定义的数据不会被正

【汇编语言/底层开发】7、更灵活的定位内存地址方法

1.[bx+idata] 通常情况下,我们使用ds和[bx]指定内存中的一个内存单元.而[bx+idata]所表示的是一种更加灵活的方式来定位内存地址,其表示的是段地址为DS,偏移地址为(bx)+idata的内存位置.通常idata为一个常量,表示一个固定的地址偏移量.如下面几条指令实际上是等价的: mov ax, [bx+200] mov ax, 200[bx] mov ax, [bx].200 其中值得注意的是200[bx]这种方法.通常在给定的数据段中,ds的值通常在程序开始时确定,中间不

【汇编语言/底层开发】10、CALL和RET指令

CALL和RET指令常常用来实现子程序的设计.这两个指令同jmp.loop.jcxz等指令同属于转移指令. 1.ret和retf 转移指令的主要功能就是修改CS和IP或者只修改IP的内容.其中ret利用栈中的数据修改IP的内容,从而实现近转移:而retf则通过使用栈中的数据同时修改CS和IP的值,实现远转移. ret指令的作用相当于: pop IP retf指令的作用相当于: pop IP pop CS ret和retf指令同程序的栈息息相关.通常情况下可以使用默认的栈空间,另外还可以自己定义一

【汇编语言/底层开发】4、使用masm编译、链接汇编源文件

0.准备工作: 由于现在我们的操作系统通常都是win7或者win8,所以要运行masm需要做一些准备工作.这里只简单描述一下过程,详细的请搜索这篇文章<Win7(64位)下使用MASM和DEBUG方法>. 首先创建一个目录,这里假设为e:\asm,并且这个目录里要包含下图中的几个文件: 安装dosbox,执行:mount c: e:asm.完成后,切换到C:目录,即到达我们建立的这个e:\asm目录下. 1.编辑汇编代码: 新建一个文本文件,文件名修改为31.asm,文件内容输入以下汇编代码:

【汇编语言/底层开发】1、CPU的总线与存储器

1. 总线 CPU对存储器的读写操作是通过链接CPU同其他芯片的导线完成的,这样的导线即称作总线.根据传输的信息的不同,总线在逻辑上分为地址总线.控制总线和数据总线3大类. (1)地址总线: CPU通过地址总线指定存储器单元,地址总线上能传递多少不同信息,CPU就可以对多少个存储单元进行寻址.如果一个CPU有N根地址线,则其地址总线宽度为N,寻址能力为2^N个内存单元. (2)数据总线: 数据总线负责CPU同内存和其他器件之间的数据传送,其宽度决定了数据传送的速度.例如80x86的数据总线宽度为