汇编语言读书笔记(11.标志寄存器)
汇编语言(第三版,王爽)读书笔记
标志寄存器
cpu内部寄存器中,有一种特殊的寄存器具有以下作用:
- 用来储存相关指令的某些执行结果
- 用来为cpu执行相关指令提供行为依据
- 用来控制cpu的相关工作方式
这些寄存器在8086cpu中被称为标志寄存器(flag)。标志寄存器有16位,其中储存的信息通常被称为程序状态字(PSW)
标志寄存器按位起作用,每一位都有专门的含义
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
OF | DF | IF | TF | SF | ZF | AF | PF | CF |
flag中的1,3,5,12,13,14,15位在8086cpu中没有使用
ZF标志
零标志位,它记录相关指令执行后,其结果是否为0.如果为0,那么zf=1;如果不为0,那么zf=0
PF标志
奇偶标志位,它记录相关指令执行后,其结果的所有bit位中1的个数是否为偶数。如果为偶数,pf=1;如果为奇数,pf=0
SF标志
符号标志位,它记录相关指令执行后,其结果是否为负。如果为负,sf=1;如果非负,sf=0
CF标志
进位标志位,在进行无符号数运算的时候,它记录了运算结果的最高有效位向更高位的进位值,或借位值。
OF标志
溢出标志位,有符号数运算溢出的记录
adc指令
adc是带进位加法指令,它利用了cf位上记录的进位值。
指令格式:adc 操作对象1,操作对象2
功能:操作对象1=操作对象1+操作对象2+CF
比如指令 adc ax,bx 实现的功能是:(ax)=(ax)+(bx)+CF
意义:在执行adc指令的时候加上cf的值的含义,是由adc指令前面的指令决定的(如果前面的指令是sub那么cf就是借位值,如果是add就是进位值),adc和add指令配合就可以对更大的数据(大于16位)进行加法运算
sbb指令
sbb是带借位减法指令,利用了cf上记录的借位值。
sbb和adc是基于同样的思想设计的两条指令。
cmp指令
cmp是比较指令,cmp的功能相当于减法指令,只是不保存结果。cmp指令执行后,将对标志寄存器产生影响。
指令格式:cmp 操作对象1,操作对象2
功能:计算操作对象1-操作对象2但不保存结果,仅根据结果对标志寄存器进行设置cmp ax,bx
如果(ax)>(bx) 则(ax)-(bx)既不必借位,结果也不为0,所以cf=0且zf=0
如果(ax)≤(bx) 则(ax)-(bx)既可能借位,结果也可能0,所以cf=1或zf=1
检测比较结果的条件转移指令
“转移”指的是它能够修改ip,而“条件”指的是它可以根据某种条件决定是否修改ip
jcxz就是一个条件转移指令,除了jcxz之外,cpu还提供了其他条件转移指令:
指令 | 含义 | 检测的相关标志位 |
---|---|---|
je | 等于则转移 | zf=1 |
jne | 不等于则转移 | zf=0 |
jb | 低于则转移 | cf=1 |
jnb | 不低于则转移 | cf=0 |
ja | 高于则转移 | cf=0且zf=0 |
jna | 不高于则转移 | cf=1或zf=1 |
DF标志和串传送指令
flag的第10位是DF,方向标志位,在串处理指令中,控制每次操作后si、di的增减
df=0 每次操作后si、di递增
df=1 每次操作后si、di递减
串传送指令:
格式:movsb
功能:
- ((es)* 16+(di))=((ds)* 16+(si))
- 如果df=0,则(si)=(si)+1,(di)=(di)+1
- 如果df=1,则(si)=(si)- 1,(di)=(di)- 1
pushf和popf
pushf的功能是将标志寄存器的值压入栈中,popf是从栈中弹出数据,送入标志寄存器
标志寄存器在debug中
在debug中我们可以看到: