315775569 发表于 2012-7-12 13:28:19

关于标志寄存器的疑问和检测点11.2的疑问!急急急急..........急急急....

写出下面的指令执行后,ZF,PF,SF,CF,OF等标志位的值
                        CFOF   SF   ZFPF
sub al,al             0    0   0    1    1
mov al,10h      0    0   0    1    1                                    
add al,90h         0    0   1    0    1
mov al,80h      0    0   1    0    1
add al,80h         1    1   0    1    1
mov al,0fch       1    1   0    1    1
add al,05h         1    0   0    0    0
mov al,7dh      1    0   0    0    0
add al,0bh         0    1   1    0    1

在做的过程中每次都纠结,是该用有符号算还是无符号算,又是怎么判断该用有符号算还是用无符号算,有时用无符号算结果就对
有时用无符号算又不对,我还真是纠结,特别是OF溢出标志,都不知道该用有符号算还是用无符号算,真是纠结。老师说OF都是
有符号算法的,CF是用无符号算的,那么在同一条指令里,不就是要用两种符号运算了吗?我还是真弄不清楚哇!!!
希望各位哥哥姐姐,能帮我解下疑问,先谢谢。。。。。。。谢谢!

极品飞车 发表于 2012-7-12 13:28:20

mov al,80h   
add al,80h
相加100H ,是3位16进制数,要装进al里面去,但是al里面只能装2位16进制数,所以就溢出了
mov al,0fch   
add al,05h
相加是1H,而不是101h,是十进制的1,因为0fch放进al就是十进制的-4,-4+5=1,所以没有溢出

敉沧 发表于 2012-7-12 13:50:50

cf表示的是无符号进位/借位
of表示的是有符号的溢出。。

怎么算的结果都一样,都会影响标志位。
而你把它当成是有符号或者无符号要看你的应用了。。

譬如,mov al,80h
add al,80h

运算后,既会改变cf位,也会改变of位。
而它属于什么运算,决定在于你。

315775569 发表于 2012-7-12 13:55:44

敉沧 发表于 2012-7-12 13:50 static/image/common/back.gif
cf表示的是无符号进位/借位
of表示的是有符号的溢出。。



大哥,可以帮我解释下每一条指令的溢出OF吗?                        谢谢哈!...........

极品飞车 发表于 2012-7-12 14:02:12

1、用win7自带的计算器,切换到程序员模式。
2、看看题目中用到的寄存器是8位的还是16位的比如本题中用到的都是8位寄存器,也就是al里面只能装1个字节。
3、然后点选下面“字节”前面的圆圈,再点选计算器中的“16进制”前面的圆圈,然后输入题目里的立即数比如0fch,再切换到十进制,这时就被转换成了-4,该知道该用有符号还是无符号了吧?

315775569 发表于 2012-7-12 14:08:03

极品飞车 发表于 2012-7-12 14:02 static/image/common/back.gif
1、用win7自带的计算器,切换到程序员模式。
2、看看题目中用到的寄存器是8位的还是16位的比如本题中用到的 ...

没有啊,还是现实252啊

315775569 发表于 2012-7-12 14:09:00

315775569 发表于 2012-7-12 13:55 static/image/common/back.gif
大哥,可以帮我解释下每一条指令的溢出OF吗?                        谢谢哈!...........

mov al,10h                        
add al,90h
有符号相加是A0H, 转十进制160,不是溢出了吗?怎么结果是???????

mov al,80h   
add al,80h
相加100H ,十进制256,不也是溢出了吗? 是不是有进位了就一定是溢出了呢??????
mov al,0fch   
add al,05h
相加是101H,十进制257,不也是溢出了吗?怎么答案是没有溢出呢???????????
就是溢出的含义我很是搞不明白呢?纠结了好几天呢,就是还不懂得。不是说是有符号无符号都是自己决定的吗?

315775569 发表于 2012-7-12 14:09:52

极品飞车 发表于 2012-7-12 14:02 static/image/common/back.gif
1、用win7自带的计算器,切换到程序员模式。
2、看看题目中用到的寄存器是8位的还是16位的比如本题中用到的 ...

mov al,10h                        
add al,90h
有符号相加是A0H, 转十进制160,不是溢出了吗?怎么结果是???????

mov al,80h   
add al,80h
相加100H ,十进制256,不也是溢出了吗? 是不是有进位了就一定是溢出了呢??????
mov al,0fch   
add al,05h
相加是101H,十进制257,不也是溢出了吗?怎么答案是没有溢出呢???????????
就是溢出的含义我很是搞不明白呢?纠结了好几天呢,就是还不懂得。不是说是有符号无符号都是自己决定的吗?

极品飞车 发表于 2012-7-12 14:36:05

mov al,10h                        
add al,90h
结果是A0h,是2位16进制数,没有溢出啊,
看有没有溢出主要看用到的寄存器,里面能放几位16进制数,al里面能放2位16进制数,ax里面能放4位16进制数,所以如果结果是3位16进制数,却要放到al里面去,就叫溢出。ok?跟10进制是几位不是对应关系。

极品飞车 发表于 2012-7-12 14:42:08

同样一个16进制数,比如A0h,它的10进制意义要看放在哪里,比如把A0h放进al,它的10进制意思是-96
但是,如果放进ax里面,它的10进制意思就是160,但是溢出不是看10进制的意义。而是看二进制的位数有没有变多,多来装不下,所以跟容器有关,也就是寄存器的容量有关。

315775569 发表于 2012-7-12 14:43:11

极品飞车 发表于 2012-7-12 14:36 static/image/common/back.gif
mov al,10h                        
add al,90h
结果是A0h,是2位16进制数,没有溢出啊,


mov al,80h   
add al,80h
相加100H ,十进制256,不也是溢出了吗? 是不是有进位了就一定是溢出了呢??????
mov al,0fch   
add al,05h
相加是101H,十进制257,不也是溢出了吗?怎么答案是没有溢出呢???????????
这是三位的怎么答案是没有溢出呢,我不明白大哥的意思哦
就是溢出的含义我很是搞不明白呢?纠结了好几天呢,就是还不懂得。不是说是有符号无符号都是自己决定的吗?

极品飞车 发表于 2012-7-12 14:59:21

注意要放进数值的这个寄存器的位数,决定了数值进去后的10进制意义。因为电脑是用二进制的补码来表示数值的,不管是正数还是负数,在电脑里面都是用补码来表示的,那么它的十进制意义就要看它放在什么寄存器里面,寄存器的位数大于这个数本身的位数,这个数前面的位都变成0了,就是正数,如果寄存器小,刚好最高位是1,就表示它是负数。也就是,只要最高位是1,就表示它是负数,因为你把这个二进制数值当成一个整数,而没有当成其他东西,比如地址值等。

315775569 发表于 2012-7-12 15:01:07

极品飞车 发表于 2012-7-12 14:51 static/image/common/back.gif
mov al,80h   
add al,80h
相加100H ,是3位16进制数,要装进al里面去,但是al里面只能装2位16进制数 ...

0fch是负数,额。。我区分不了它怎么会是负数呢!呵呵.........为什么不是正数啊?

极品飞车 发表于 2012-7-12 15:22:27

0fch放进al里面的补码是11111100,最高位是1,所以是负数-4
0fch放进ax里面 补码是0000000011111100,最高位是0,所以是这正数252

XXXXXXX 发表于 2012-7-13 14:50:01

本帖最后由 XXXXXXX 于 2012-7-13 14:51 编辑

我也遇到这个检测点了,上面看了很多遍,但还是没看懂,求详细过程,尤其是最后一个

315775569 发表于 2012-7-13 19:42:28

XXXXXXX 发表于 2012-7-13 14:50 static/image/common/back.gif
我也遇到这个检测点了,上面看了很多遍,但还是没看懂,求详细过程,尤其是最后一个

mov al,0fch      
add al,05h
求CF的值,不管是有符号还是无符号,鱼老师说过CF都是无符号运算,所以求CF的值都是用无符号来运算
0FCH 加 05H 等于101H 所以进位
求OF的值 --0FCH 转二进制是11111100B,是负数,那么这个就是补码形式,所以要转变,那么0FCH=-4
--05H转二进制是00000101B ,是正数。是原码,所以-4+5=1,所以没有超过范围,所以没有溢出,求SF,ZF,PF,都是用无符号运算

mov al,7dh      
add al,0bh
7DH 的最高位是0,那么就是正数, 0BH最高位也是0,也是正数,所以是正数加法,得出的结果是88H
没有进位, 88H转十进制是136,所以溢出,二进制是10001000B,AL是8位寄存器,最高位是1,所以是负数,ZF不为0 所以是0,有两个1是偶数,所以PF是1.
我也是昨天经过上面的老哥才懂得的,我也是新手,呵呵,互动互动!

XXXXXXX 发表于 2012-7-14 13:51:08

315775569 发表于 2012-7-13 19:42 static/image/common/back.gif
mov al,0fch      
add al,05h
求CF的值,不管是有符号还是无符号,鱼老师说过CF都是无符号运算,所以 ...

谢谢,总算差不多弄明白了,互动 互勉
在判断OF时,前一个的结果是101H,重新考虑相加的两个数0fch和05h,可如果像后面那个一样直接把结果(101h)转化为十进制来看就会发现溢出。
这是说在结果出现进位后,就不能直接用结果来判断OF了吗(因为我无法知道这个有进位的结果(101h)究竟是正还是负),所以就只能把加数化成带符号十进制再相加来判断是否溢出

菜鸟一个a 发表于 2014-2-11 21:26:15

学习学习再学习

bubu 发表于 2014-2-13 14:25:11

我来学习一下。

doomsday 发表于 2014-3-22 00:47:41

极品飞车 发表于 2012-7-12 14:02 static/image/common/back.gif
1、用win7自带的计算器,切换到程序员模式。
2、看看题目中用到的寄存器是8位的还是16位的比如本题中用到的 ...

我就不明白为什么要这样才会显示正确
页: [1]
查看完整版本: 关于标志寄存器的疑问和检测点11.2的疑问!急急急急..........急急急....