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

简介: 除了前述的多种具有特定用途的寄存器之外,8086的CPU中还存在一类特殊的寄存器,称为标识寄存器flag,其每一位可能用来存储特定的信息,主要有以下三类: (1)相关指令的某些执行结果; (2)为CPU执行相关指令提供依据; (3)控制CPU的相关工作方式。

除了前述的多种具有特定用途的寄存器之外,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

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

目录
相关文章
|
存储
汇编语言中“$”的作用
汇编语言中“$”的作用
744 0
汇编语言中“$”的作用
|
8月前
|
存储 编译器 C语言
5.6 汇编语言:汇编高效数组寻址
数组和指针都是用来处理内存地址的操作,二者在C语言中可以互换使用。数组是相同数据类型的一组集合,这些数据在内存中是连续存储的,在C语言中可以定义一维、二维、甚至多维数组。多维数组在内存中也是连续存储的,只是数据的组织方式不同。在汇编语言中,实现多维数组的寻址方式相对于C语言来说稍显复杂,但仍然可行。下面介绍一些常用的汇编语言方式来实现多维数组的寻址。
95 0
|
8月前
|
存储 JavaScript
5.2 汇编语言:标志位测试指令
汇编语言是一种面向机器的低级语言,用于编写计算机程序。汇编语言与计算机机器语言非常接近,汇编语言程序可以使用符号、助记符等来代替机器语言的二进制码,但最终会被汇编器编译成计算机可执行的机器码。标志位测试指令是汇编语言中用于测试处理器标志位状态的指令。标志位是位于处理器状态寄存器中的一组特殊标志,用于指示上一个运算的结果是否为零、是否进位/借位、是否溢出等等。可以使用标志位测试指令来检查标志位的状态,并在需要时根据标志位状态进行操作。
142 0
指令系统——扩展操作码指令格式
指令系统——扩展操作码指令格式
732 0
指令系统——扩展操作码指令格式
|
Windows 程序员 Perl
汇编语言 标志位介绍
一、运算结果标志位 1、进位标志CF(Carry Flag) 进位标志CF主要用来反映运算是否产生进位或借位。
1565 0
|
存储
汇编语言之标志寄存器
汇编语言之标志寄存器
220 0
汇编语言之标志寄存器
|
机器学习/深度学习
汇编语言之寄存器(CPU工作原理)(2)
汇编语言之寄存器(CPU工作原理)(2)
128 0
汇编语言之寄存器(CPU工作原理)(2)
|
存储
汇编语言之寄存器(CPU工作原理)(1)
汇编语言之寄存器(CPU工作原理)(1)
234 0
汇编语言之寄存器(CPU工作原理)(1)
|
机器学习/深度学习
汇编语言之寄存器(内存访问)2
汇编语言之寄存器(内存访问)2
148 0
汇编语言之寄存器(内存访问)2
|
存储 机器学习/深度学习
汇编语言之寄存器(内存访问)1
汇编语言之寄存器(内存访问)1
270 0
汇编语言之寄存器(内存访问)1

热门文章

最新文章