当前位置: 代码迷 >> 汇编语言 >> 一个关于标志寄志器标志位的有关问题
  详细解决方案

一个关于标志寄志器标志位的有关问题

热度:9701   发布时间:2013-02-26 00:00:00.0
一个关于标志寄志器标志位的问题?
下面程序执行后: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

进位则是无符号数, 同样, 结果超出表示范围就发生进位.

同样的运算, 设置不同的标记, 为的就是后面的判别上的各取所需.
  相关解决方案