【汇编语言/底层开发】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

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

目录
相关文章
|
5天前
|
存储 程序员 存储控制器
【读书笔记】汇编语言(第四版)第二章 寄存器
【读书笔记】汇编语言(第四版)第二章 寄存器
|
24天前
|
存储
8086 汇编笔记(二):寄存器(内存访问)
8086 汇编笔记(二):寄存器(内存访问)
|
24天前
|
存储
8086 汇编笔记(一):寄存器
8086 汇编笔记(一):寄存器
|
1月前
|
索引 存储 C语言
【汇编】[bx+idata]的寻址方式、SI和DI寄存器
【汇编】[bx+idata]的寻址方式、SI和DI寄存器
130 0
【汇编】[bx+idata]的寻址方式、SI和DI寄存器
|
1月前
|
编译器 存储 网络协议
【汇编】CS、IP寄存器与代码段,用汇编语言写的源程序,jmp指令
【汇编】CS、IP寄存器与代码段,用汇编语言写的源程序,jmp指令
126 1
【汇编】CS、IP寄存器与代码段,用汇编语言写的源程序,jmp指令
|
1月前
|
存储 程序员
【汇编】内存的读写与地址空间、寄存器及数据存储
【汇编】内存的读写与地址空间、寄存器及数据存储
254 1
【汇编】内存的读写与地址空间、寄存器及数据存储
|
7月前
|
存储 安全 Windows
3.6 Windows驱动开发:内核进程汇编与反汇编
在笔者上一篇文章`《内核MDL读写进程内存》`简单介绍了如何通过MDL映射的方式实现进程读写操作,本章将通过如上案例实现远程进程反汇编功能,此类功能也是ARK工具中最常见的功能之一,通常此类功能的实现分为两部分,内核部分只负责读写字节集,应用层部分则配合反汇编引擎对字节集进行解码,此处我们将运用`capstone`引擎实现这个功能。
39 0
3.6 Windows驱动开发:内核进程汇编与反汇编
|
11月前
|
存储 IDE Java
二进制到汇编:进制,原码反码补码,位运算,通用寄存器,内存一套打通
二进制到汇编:进制,原码反码补码,位运算,通用寄存器,内存一套打通
143 1
|
存储 Java C++
汇编语言、寄存器分类及程序计数器
汇编语言、寄存器分类及程序计数器
100 0
|
安全 开发工具 Windows
驱动开发:内核实现进程汇编与反汇编
在笔者上一篇文章`《驱动开发:内核MDL读写进程内存》`简单介绍了如何通过MDL映射的方式实现进程读写操作,本章将通过如上案例实现远程进程反汇编功能,此类功能也是ARK工具中最常见的功能之一,通常此类功能的实现分为两部分,内核部分只负责读写字节集,应用层部分则配合反汇编引擎对字节集进行解码,此处我们将运用`capstone`引擎实现这个功能。
244 0