标志寄存器
CPU 内部的寄存器中,有一种特殊的寄存器(对于不同的处理机,个数和结构都可能不同)具有以下3 种作用。
- 用来存储相关指令的某些执行结果;
- 用来为CPU 执行相关指令提供行为依据:
- 用来控制CPU 的相关工作方式。
flag 寄存器是按位起作用的,也就是说,它的每一位都有专门的含义,记录特定的信息。
1 flag寄存器标志
在Debug 中,标志寄存器是按照有意义的各个标志位单独表示的。在Debug 中,我们可以看到下面的信息。
1.1 ZF标志
flag 的第6 位是ZF,零标志位。它记录相关指令执行后,其结果是否为0 。如果结果为0,那么zf=1 ;如果结果不为0,那么zf=0。
1.2 PF标志
flag 的第2 位是PF , 奇偶标志、位。它记录相关指令执行后,其结果的所有bit 位中1的个数是否为偶数。如果1 的个数为偶数, pf=l ,如果为奇数,那么pf=0。
1.3 SF标志
flag 的第7 位是SF ,符号标志位。它记录相关指令执行后,其结果是否为负。如果结果为负, SF=l ;如果非负, SF=0 。
1.4 CF标志
flag 的第0 位是CF,进位标志位。一般情况下,在进行无符号数运算的时候,它记录了运算结果的最高有效位向更高位的进位值,或从更高位的借位值。
1.5 OF标志
对于无符号数运算, CPU 用CF 位来记录是否产生了进位;对于有符号数运算, CPU 用OF 位来记录是否产生了溢出,当然,还要用SF 位来记录结果的符号。
2 指令
2.1 adc指令
adc 是带进位加法指令,它利用了CF 位上记录的进位值。
指令格式: adc 操作对象1 ,操作对象2
功能: 操作对象1 =操作对象1 +操作对象2 + CF
比如指令adc ax,bx 实现的功能是:(ax)=(ax)+(bx)+ CF
2.2 sbb指令
sbb 是带借位减法指令,它利用了CF 位上记录的借位值。
指令格式: sbb 操作对象l ,操作对象2
功能:操作对象l =操作对象1-操作对象2-CF
比如指令sbb ax,bx 实现的功能是:(ax)=(ax)-(bx)-CF
2.3 cmp指令
cmp 是比较指令, cmp 的功能相当于减法指令,只是不保存结果。cmp 指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果。
cmp 指令格式: cmp 操作对象1 , 操作对象2
功能:计算操作对象1-操作对象2 但并不保存结果,仅仅根据计算结果对标志寄存器进行设直。
3 检测比较结果的条件转移指令
指令含义检测的相关标志位
je | 等于则转移zf=1 |
---|---|
jne | 不等于则转移zf=0 |
jb | 低于则转移cf =1 |
jnb | 不低于则转移cf=0 |
ja | 高于则转移cf=0 且zf=0 |
jna | 不高于则转移cf=1 或zf=1 |
4 DF 标志和串传送指令
4.1 DF标志
flag 的第10 位是DF,方向标志位。在串处理指令中,控制每次操作后si 、di 的增减。
df=0 每次操作后si 、di 递增:
df=1 每次操作后si 、di 递减。
4.2 movsb指令
用汇编语法描述movsb 的功能如下。
moves : [di],byte ptr ds: [si) ;8086 并不支持这样的指令,这里只是个描述
如果df=O:
lnc si
inc di
如果df=l:
dec si
dec di
5 pushf 和popf
pushf 的功能是将标志寄存器的值压栈,而popf 是从栈中弹出数据,送入标志寄存器中。
pushf 和 popf,为直接访问标志寄存器提供了一种方法。
5 pushf 和popf
pushf 的功能是将标志寄存器的值压栈,而popf 是从栈中弹出数据,送入标志寄存器中。
pushf 和 popf,为直接访问标志寄存器提供了一种方法。
在Debug 中,标志寄存器是按照有意义的各个标志位单独表示的。在Debug 中,我们可以看到下面的信息。