汇编-11.0-标志寄存器

1.标志寄存器

(1).用来存储相关指令的某些执行结果;

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

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

flag寄存器是按位起作用的,每一位都有专门的含义,记录特定的信息。

flag的1、3、5、12、13、14、15位在8086CPU中没有使用,不具有任何意义,而0、2、4、6、8、9、10、11位都具有特殊的含义。

2.ZF标志

flag的第六位是ZF标志位,零标志位。它记录相关指令执行后,其结果是否为0.如果为0,

那么zf=1,如果不为0,那么zf=0.

3.PF标志

flag的第二位是PF,奇偶标志位。它记录相关指令执行后,其结果的所有bit位中1的个数是否为偶数。如果1的个数为偶数,pf=1,如果为奇数,

那么pf=0.

4.SF标志

flag额第七位是SF,符号标志位。它记录相关指令执行后,其结果是否为负,如果为负,sf=1;如果不是,则sf=0.

SF标志,就是CPU对有符号数运算结果的一种记录,它记录数据的正负。在我们将数据当作有符号来运算的时候,

可以通过它来的知结果的正负。如果我们将数据当作无符号值则没有意义,虽然相关的指令影响了它的值。

5.CF标志

flag的第0位是CF,进位标志位。一般情况下,在进行无符号运算时,它记录了运算结果的最高有效位向更高的进位值,

或从更高位的借位值。

对于位数为N的无符号来说,其对应的二进制的最高位,即第N-1位,就是它的最高有效位,而假想存在的第N位,

就是相对于最高有效位的更高位。

6.OF标志

由于在进行有符号运算时,可能发生溢出而造成结果的错误。则CPU需要对指令执行后是否产生溢出进行记录。

flag的第11位时OF位,溢出标志位。一般情况下,OF记录了有符号数运算的结果是否发生了溢出。如果发生溢出,OF=1;

如果没有,OF=0。

CF和OF的区别:CF是对无符号运算有意义的标志位,而OF是对有符号运算有意义的标志位。

 7.adc指令

adc是带进位加法指令,它利用了CF位上的记录的进位值。

指令格式:adc 操作对象1,操作对象2

功能:操作对象1=操作对象1+操作对象2+CF

在执行adc指令的时候加上CF的值的含义,是由于adc指令前面的指令决定的,也就是说,关键在于加上CF值是被什么指令设置。

显然,如果CF的值被sub指令设置的,那么它就是借位值;如果是add指令设置的,那么它就是进位值。

8.sbb指令

sbb是带借位减法指令,它利用了CF位上记录的借位值。

指令格式:sbb 操作对象1,操作对象2

功能:操作对象1=操作对象1-操作对象2-CF

9.cmp指令

cmp是比较指令,cmp的功能相当于减法指令,只是不保存结果。cmp指令执行后,将对标志寄存器产生影响。

其他相关指令通过识别这些影响的标志寄存器位来得知比较结果。

cmp指令格式:cmp 操作对象1,操作对象2

功能:计算操作对象1-操作对象2 但不保存结果,仅仅根据计算结果对标记寄存器进行设置。

同add、sub指令一样,CPU在执行cmp指令的时候,也包含两种意义:进行无符号数运算和进行有符号数运算。

在cmp指令使用时,需要知道OF寄存器有没有产生溢出;

(1).sf=1,of=0

of=0,说明没有溢出,逻辑上真正的结果正负=实际结果的正负;

因sf=1,实际结果为负,所以逻辑的结果为负。

(2).sf=1,of=1

of=1,说明有溢出,逻辑上真正的结果正负!=实际结果的正负;

因sf=1,实际结果为负,而又有溢出,这说明由于溢出导致了实际结果为负。

因为溢出导致了实际结果为负,那么逻辑上真正的结果必然为正。

(3).sf=0,of=1

of=1,说明有溢出,逻辑上真正的结果正负!=实际结果的正负;

因sf=0,实际结果为非负,又有溢出,则结果非0。所以结果为正。

这说明是由于溢出导致了实际结果非负;

因为溢出导致实际结果为正,那么逻辑上真正的结果必然为负。

(4).sf=0,of=0

of=0,说明没有溢出,逻辑上真正的结果正负=实际结果的正负;

因sf=0,实际结果为非负,所以逻辑的结果为非负。

10.检测比较结果的条件转移指令

转移指的就是它能够修改IP,而“条件”指的是它可以根据某种条件,决定是否修改IP。

因为cmp指令可以同时进行有符号和无符号两种比较,根据cmp指令的比较结果进行转移的指令也分为两种,

即根据无符号数的比较转移的指令(它们检测zf、cf的值)和根据有符号的比较结果进行的条件转移指令

(它们检测sf、of和zf的值)。

常用的根据无符号数的比较结果进行转移的条件转移指令:

第一个字母都是j,表示jump;后面的字母表示:

如:如果(ah)=(bh),则(ah)=(ah)+(ah),否则(ah)=(ah)+(bh).

cmp ah,bh
je s
add sh,bh
jmp short ok
s:add ah,ah
ok:........                 ;如果(ah)=(bh),则cmp ah,bh,使zf=1,而je检测zf是否为1
                            ;如果为1,将转移到标号s处执行指令add ah,ah.

 11.DF标志和串传送指令

flag的第10位是DF,方向标志位。在串处理指令中,控制每次操作后si、di的增减。

df=0  每次操作后si、di递减;

df=1  每次操作后si、di递减。

传送一个字节指令:

格式:movsb

功能:执行movsb指令相当于进行下面几步操作。

(1).((es)*16+(di))=((ds)*16+(si))

(2)如果df=0则:

(si)=(si)+1

(di)=(di)+1

如果df=1则:

(si)=(si)-1

(si)=(di)-1

movsb的功能是将ds:si指向的内存单元中的字节送入es:di中,然后根据标志寄存器df位的值,将si和di递增或递减。

传送字指令:

格式:movsw

movsw的功能是将ds:si指向的内存字单元中的字送入es:di中,然后根据标志寄存器df位的值,将si和di递增2或者减2.

movsb和movsw都和rep配合使用,格式如下:

rep movsb

用汇编语法来描述rep movsb的功能就是:

s:movsb

loop s

rep的作用是根据cx的值,重复执行后面的传送指令。由于每一次执行movsb指令si和di都会递增或递减指向后一个单元或前一个单元,

则rep movsb就可以循环实现(cx)个字符的传送。

12.pushf和popf

pushf的功能是将标志寄存器的值压栈,而popf是从栈中弹出数据,送入标志寄存器。

pushf和popf,是直接访问标志寄存器的一种方法。

13.标记寄存器在Debug中的表示

在Debug中,标志寄存器是按照有意义的各个标志位单独表示的:

 

 

表示意义:

 

posted @ 2018-08-15 11:42  西贡小傻  Views(171)  Comments(0Edit  收藏  举报