第11章 标志寄存器

标志寄存器flag的3个作用:

1、用来存储相关指令的某些执行结果。

2、用来为CPU执行相关指令提供行为依据。

3、用来控制CPU的相关工作模式。

标志寄存器都是16位寄存器。

标志寄存器中的有效位都是以F结尾的,它们是如下几个:

CF(Carry Flag):进位标志位。

PF(Parity Flag):奇偶标志位。

ZF(Zero Flag):零标志位。

SF(Symbol Flag):符号标志位。

OF(Overflow Flag):溢出标志位。

DF(Direction Flag):方向标志位。

它们在标志寄存器中的分布情况如下所示:

标志寄存器通常用来存储PSW,即程序状态字,Program Status Word。

标志寄存器中只有0、2、4、6、7、8、9、10、11有特殊意义,其他无用。

11.1

ZF标志

标志寄存器中的第6位是ZF,叫做零标志位。

用于判断结果是否为0,如果是ZF=1,否则ZF=0。

在计算机中1表示真,0表示假。

有些指令的执行对于ZF是有影响的,有些没有。

有影响的一般是运算指令。

11.2

PF标志

标志寄存器中的第2位是PF,即,奇偶标志位。

它用于判断指令执行后结果的二进制表示中的1的个数是否是偶数,如果是PF=1,否则PF=0。

11.3

SF标志

标志寄存器的第7位是SF,即,符号标志位。

它判断指令执行后结果是否为负,如果是则SF=1,否则SF=0。

SF是CPU对于有符号数运算的一种记录。

11.4

CF标志

标志寄存器第0位是CF,即,进位标志位。

在无符号数运算时它记录了结果最高有效位向更高位的进位值,或从更高位的借位值。

进位是针对加法而言的,而借位是针对减法而言的。

由此可见,它存储的不再是简单的0和1,而是具体的数值。

11.5

OF标志

标志寄存器中的第11位是溢出标志位。

它用于判断有符号数计算所得结果是否溢出,如果是则OF=1,否则OF=0。

11.6

adc指令

带进位的加法指令。

adc:Add With Carry。

格式:

adc操作数1操作数2

功能:操作数1=操作数1+操作数2+CF。

这条指令的作用是可以将加法运算分解执行。

正是因为有了进位,下一步加法才能不依赖于低位数据而只需要进位数据,从而只需要进行当前位的运算,它的更高位也依此计算。这样你可以把一个大数的各位放在不同的寄存器中计算,或者循环利用两个寄存器分别对加数和被加数的各位进行计算,这提高了寄存器的利用率。

所以,由此可见adc能进行任意大数的计算。

11.7

sbb指令

Substract

With Borrow。

带借位的减法指令,它也利用了CF标志位。

格式:

sbb操作数1操作数2

功能:操作数1=操作数1-操作数2-CF。

与adc相同,sbb也能计算任意大数的减法运算。

11.8

cmp指令

Compare。

比较指令,它会影响各寄存器。

格式:

CMP操作数1操作数2

功能为:

操作数1-操作数2

它影响ZF、PF、SF、CF、OF。

CPU是根据各标志位综合判断操作数1和操作数2的关系的。

它可以对无符号数和有符号数进行比较。

对无符号数进行比较时,它影响ZF、CF。对有符号数进行比较时它影响SF、OF、ZF。

这节讲的内容比较多,逻辑性比较强。

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

转移指的是它能够修改IP。

本届介绍了6个条件转移指令。

JE(Jumpwhen Equal)

JNE(Jumpwhen Not Equal)

JB(Jumpwhen Below)

JNB(Jumpwhen Not Below)

JA(Jumpwhen Above)

JNA(Jumpwhen Not Above)

它们都是通过检测CF和ZF进行转移的,它们都是无符号数之间进行比较,从而进行跳转的指令,它们的详细说明可以看表11.1。

11.10

DF标志和串传送指令

DF是方向标志位,它控制SI和DI的增减。

DF=0,则SI和DI增。

DF=1,则SI和DI减。

MOVSB:串传送指令,Move String Byte,它以字节为单位传送数据。

功能为:

((ES)×16+(DI))=((DS) ×16+ (SI))

if DF=0 then (SI)+=1 (DI)+=1;

else (SI)-=1 (DI)-=1

从这个功能描述来看,这条命令好像是在COPY赋值。源位置是在DS:SI,目的位置在ES:DI。

DEC:Decrease,自减一。

MOVSB的变种是MOVSW(Move String Word),MOVSW以字为单位传送数据。

MOVSW可以把SI和DI增减2。

它俩的格式是:

REP MOVSB/MOVSW

REP:repeat,循环重复的意思,所以这条指令的意思就是循环执行MOVSB/MOVSW。

树上的解释如下:

S:MOVSB/MOVSW

LOOP S

8086CPU提供两条指令对DF进行置位——cld和std指令。

cld:Clear Direction,置DF为0。

std:Set Direction,置DF为1。

11.11

pushf和popf

PUSHF:PUSH FLAG,它是将标志寄存器中的值压栈。

POPF:POP FLAG,它是将栈中的标志寄存器值出栈。

它们直接访问标志寄存器。

你可能感兴趣的:(第11章 标志寄存器)