标志寄存器
FLAGS
作用
- 用来存储相关指令的某些执行结果
- 用来为CPU执行相关指令提供行为依据
- 用来控制CPU的相关工作方式
空位为未定义保留位
ZF
- flag的第六位是ZF,零标志位。
- 它记录相关指令执行后,其结果是否为0。
- 如果结果为0,那么zf=1;如果结果不为0,那么zf=0。
PF
- flag的第2位是PF,奇偶标志位。
- 记录相关指令执行后,结果的所有bit位中1的个数是否是偶数。
- 如果结果bit位中有 偶数个1,则pf=1,奇数个1,pf=0。
SF
- flag的第7位是 SF(symbol flag),符号标志位。
- 它记录相关指令执行后,结果是否为负。
- 如果为负,sf=1;非负,则sf=0。
CF
- flag的第0位是CF,进位标志位。
- 一般情况下,在进行无符号数运算的时候,它记录了运算结果的最高有效位向更高位的进位值,或从更高位的借位值。
OF
- flag的第11位是OF,溢出标志位。
- OF记录了有符号数运算结果是否溢出。
- 如果溢出,OF=1,没有则OF=0。
adc
adc是带进位加法指令,它利用了CF位上的记录的进位值。
类add但带了CF
功能:对象1=对象1+对象2+CF
sub
很明显,之前有了带进位加法adc,这个就是带借位减法。
类sub但带了CF
功能:对象1=对象1-对象2-CF
cmp
cmp是比较指令,cmp的功能相当于减法指令,但是不保存结果
功能:对象1-对象2,但不保存结果,不改变对象,只对标志寄存器进行重置
test
Test命令将两个操作数进行逻辑与运算,并根据运算结果设置相关的标志位。但是,Test命令的两个操作数不会被改变。
条件转移指令
je(equl)
cmp后等于则转移(zf=1)
jne
cmp后不等于则转移(zf=0)
相对于无符号数
jb(below)
cmp后低于则转移(cf=1)
jnb
cmp后不低于则转移(cf=0)
ja(above)
cmp后高于则转移(cf=0&&zf=0)
jna
cmp不高于则转移(cf=1&&zf=1)
相对于有符号数
jl(less)
cmp后小于则转移
jnl
cmp后不小于则转移
jg(greater)
cmp后大于则转移
jng
cmp后不大于则转移
DF(definition flag)和串传送
df
也是flag之一
df=0 每次操作后si di递增
df=1 每次操作后si di递减
唯一可修改的标志位
cld
df清零
std
df置1
rep
rep movsb
相当于:
s:
movsb
loop s
(循环则需预先设置cx)
movsb
1、((es)*16+(di))=((ds)*16+(si))
2、如果df=0 则:
inc si
inc di
如果df=1 则:
dec si
dec di
movsw
按字操作,di和si增减单位为2字节
mov es:[di],word ptr ds:[si]
如果df=0 则:
add si,2
add di,2
如果df=1 则:
sub si,2
sub di,2
题
1 | code |
pushf和popf
pushf的功能是将标志寄存器的值压栈,而popf就是将其出栈,扔入flag。
用于中断保护“现场”
popf可用于修改标志位