下面程序执行后:ax=?
mov ax,0
push ax
popf
mov ax,0fff0h
add ax,0010h
pushf
pop ax
and al,11000101B
and ah,00001000B
请问当程序执行完add ax,0010h后,
为什么标志寄存器会是这样??
cf of sf zf pf
1 0 0 1 1
而不是
cf of sf zf pf
1 1 0 0 0
------解决方案--------------------------------------------------------
0fff0h+10h = 0 所以, zf=1 (结果为 0), sf=0 (结果为非负数), pf=1 (结果偶数个 1)
运算过程中, 产生了进位, 所以 cf=1. 负数+正数, 结果当然不会溢出, 所以 of=0
------解决方案--------------------------------------------------------
mov ax,0fff0h
add ax,0010h
--------------------------------
本来结果就是10000h啊!16位,早应该溢出了!
因为这是ax的值为(10000h的低位)0000h,所以就是0了。zf就==1了,而这时候ax中的值中的“1”为0,为偶数,所以pf==1,也因为借位了,所以cf==1 ,但想不通的是of,难到是因为32位的问题?进位存放在eax的高位了,所以才of==0????
------解决方案--------------------------------------------------------
溢出和进位是不同的概念. 溢出是对有符号数的, 当结果超出了表示范围时才产生溢出.
作为有符号数, 0fff0h=-16, 10h=16, -16+16=0, 完全在一个 16 位的有符号数的表示范围之内, 所以, 没有产生溢出, 0f=0
进位则是无符号数, 同样, 结果超出表示范围就发生进位.
同样的运算, 设置不同的标记, 为的就是后面的判别上的各取所需.