1.标志寄存器
标志 | |
ZF(zero flag) | 如果结果为0,zf=1;否则为0 |
PF(parity flag) | 如果结果为偶数个1,pf=1;否则为0 |
SF(sign flag) | 如果结果为负数,sf=1;否则为0 |
CF(carry flag) | 无符号运算的时候,最高位向更高位的进位值或者从更高位的借位值 |
OF(overflow flag) | 有符号的运算的结果,如果发生了溢出,则of=1;否则为0 |
df(direction flag) | 在串处理指令中,df=0:每次操作后si ,di递增 df=1:每次操作后si,di递减 |
note:inc dec不影响cf
答:
1.INC,DEC指令不影响CF标志位,这个是Intel规定的!其原因是硬件设计造成的,总之,对软件人员来说不重要!
2.INC,DEC指令不影响CF标志位,这表明执行INC/DEC指令之后,CF不能反映进位情况
INC 0000000011111111
0000000011111111+1当然要进位,但不设置CF为1。
你的问题就在于,将进位与CF等同
CF被称为进位标志位,在多数情况下,它确实反映进位情况,但不是绝对的,INC/DEC就是其中两例
INC/DEC指令不影响CF标志位,这句话就是明明白白地告诉你,此时,CF与进位无关
2.adc指令
带进位加法指令,利用了cf上的进位值
3.adc指令
带借位减法指令,利用了cf上的借位值
4.cmp指令
减法,改变标志寄存器,不保存结果。
5.串传送指令
movsb:(对于字节)
mov es:[di],byte ptr ds:[si]
if df=0:
inc si
inc di
if df = 1 :
dec si
dec di
movsw:(对于字)
mov es:[di],word ptr ds:[si]
if df=0
add si,2
add di,2
if df=1
sub si,2
sub di,2
rep movsb
s:movsb
loop s
rep movsw
s:movsw
loop s
6.对df置位
1.cld:将df置0
std:将df置1
7.pushf 和popf:将标志寄存器的值压栈/pop栈
为直接访问寄存器提供了一种方法