VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 35|回复: 4

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

[复制链接]

2

主题

4

帖子

5

积分

新手上路

Rank: 1

积分
5
发表于 2020-1-23 01:40:01 | 显示全部楼层 |阅读模式
下面程序执行后: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
回复

使用道具 举报

0

主题

22

帖子

16

积分

新手上路

Rank: 1

积分
16
发表于 2020-2-9 01:00:01 | 显示全部楼层
0fff0h+10h = 0  所以, zf=1 (结果为 0), sf=0 (结果为非负数), pf=1 (结果偶数个 1)
运算过程中, 产生了进位, 所以 cf=1. 负数+正数, 结果当然不会溢出, 所以 of=0
回复

使用道具 举报

0

主题

9

帖子

6

积分

新手上路

Rank: 1

积分
6
发表于 2020-2-11 11:30:01 | 显示全部楼层
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????
回复

使用道具 举报

0

主题

22

帖子

16

积分

新手上路

Rank: 1

积分
16
发表于 2020-2-13 17:00:02 | 显示全部楼层
溢出和进位是不同的概念. 溢出是对有符号数的, 当结果超出了表示范围时才产生溢出.
作为有符号数, 0fff0h=-16, 10h=16, -16+16=0, 完全在一个 16 位的有符号数的表示范围之内, 所以, 没有产生溢出, 0f=0

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

同样的运算, 设置不同的标记, 为的就是后面的判别上的各取所需.
回复

使用道具 举报

2

主题

4

帖子

5

积分

新手上路

Rank: 1

积分
5
 楼主| 发表于 2020-6-21 21:15:01 | 显示全部楼层
谢谢www_james
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2020|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表