标志寄存器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有特殊意义,其他无用。
标志寄存器中的第6位是ZF,叫做零标志位。
用于判断结果是否为0,如果是ZF=1,否则ZF=0。
在计算机中1表示真,0表示假。
有些指令的执行对于ZF是有影响的,有些没有。
有影响的一般是运算指令。
标志寄存器中的第2位是PF,即,奇偶标志位。
它用于判断指令执行后结果的二进制表示中的1的个数是否是偶数,如果是PF=1,否则PF=0。
标志寄存器的第7位是SF,即,符号标志位。
它判断指令执行后结果是否为负,如果是则SF=1,否则SF=0。
SF是CPU对于有符号数运算的一种记录。
标志寄存器第0位是CF,即,进位标志位。
在无符号数运算时它记录了结果最高有效位向更高位的进位值,或从更高位的借位值。
进位是针对加法而言的,而借位是针对减法而言的。
由此可见,它存储的不再是简单的0和1,而是具体的数值。
标志寄存器中的第11位是溢出标志位。
它用于判断有符号数计算所得结果是否溢出,如果是则OF=1,否则OF=0。
带进位的加法指令。
adc:Add With Carry。
格式:
adc操作数1操作数2
功能:操作数1=操作数1+操作数2+CF。
这条指令的作用是可以将加法运算分解执行。
正是因为有了进位,下一步加法才能不依赖于低位数据而只需要进位数据,从而只需要进行当前位的运算,它的更高位也依此计算。这样你可以把一个大数的各位放在不同的寄存器中计算,或者循环利用两个寄存器分别对加数和被加数的各位进行计算,这提高了寄存器的利用率。
所以,由此可见adc能进行任意大数的计算。
Substract
With Borrow。
带借位的减法指令,它也利用了CF标志位。
格式:
sbb操作数1操作数2
功能:操作数1=操作数1-操作数2-CF。
与adc相同,sbb也能计算任意大数的减法运算。
Compare。
比较指令,它会影响各寄存器。
格式:
CMP操作数1操作数2
功能为:
操作数1-操作数2
它影响ZF、PF、SF、CF、OF。
CPU是根据各标志位综合判断操作数1和操作数2的关系的。
它可以对无符号数和有符号数进行比较。
对无符号数进行比较时,它影响ZF、CF。对有符号数进行比较时它影响SF、OF、ZF。
这节讲的内容比较多,逻辑性比较强。
转移指的是它能够修改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。
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。
PUSHF:PUSH FLAG,它是将标志寄存器中的值压栈。
POPF:POP FLAG,它是将栈中的标志寄存器值出栈。
它们直接访问标志寄存器。