| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 7194 人关注过本帖
标题:请问到底什么时候才应该补码?
只看楼主 加入收藏
ghhr6
Rank: 1
等 级:新手上路
威 望:1
帖 子:9
专家分:0
注 册:2014-6-22
收藏
 问题点数:0 回复次数:3 
请问到底什么时候才应该补码?
我看到了王爽的of标记寄存器.
看到某部份开始不太明白了,.

原文:
mov al,98
add al,99

其结果al=C5h,这里我可以理解.然后它又说这次是有符号运算,所以要给al的值即C5h进行补码,那么真正的结果是-59.
而-59这个运算结果显然是错误的,都归因"溢出"所致.
然后我明白了,只要是有符号运算,必须把结果给补码才能得到正确的运算结果.

可我接下去看,原文又出现一个新例子:

mov al,0f0h
add al,088h

它说al=78h,还说78h表示有符号数120.

这里我有一个问题,为什么在这一次的有符号运算中,它们不把al的值78h进行补码呢?
我认为78h表示无符号数应该是120.
78h表示有符号数应该是-136.


[ 本帖最后由 ghhr6 于 2014-11-30 18:10 编辑 ]
搜索更多相关主题的帖子: 寄存器 
2014-11-30 18:08
不玩虚的
Rank: 9Rank: 9Rank: 9
来 自:四川
等 级:贵宾
威 望:10
帖 子:331
专家分:1301
注 册:2012-12-9
收藏
得分:0 
,你自己拿笔算算,看你的结果c5h,和78h知道al是八位的,98 的二进制为0110 0010 99的为0110 0011 相加的 1110 0101 你自己算是是多少啊 224吧,八位只能表示-128 - 127,你说结果怎么表示啊,ofoh 的二进制0000 0000 1111 0000 088h为 0000 0000 1000 1000 相加结果为 0000 0001 0111 1000 al是八位的吧 0111 1000  这不120 能表示的嘛,还有of标志位看看有啥用的。两个例子那个的off为1,哪个为0 自己看看。

同学习......同进步....你帮我......我帮你.....上善若水.....
2014-12-17 20:24
取名字
Rank: 8Rank: 8
等 级:贵宾
威 望:21
帖 子:236
专家分:924
注 册:2015-4-27
收藏
得分:0 
对于楼主的问题,其实是不太清楚计算机中数据的表示,任何数据在计算机中都是用二进制表示的,且都是用补码表示的,只不过正数的补码就是它本身,而负数的补码是它的绝对值的所有二进制位取反然后再加1。
在王爽的书中,这一章说得很清楚,在每一次计算中,计算机都用一种信息表示了两种含义,如“mov al,98”“add al,99”,你可以把它看成是有符号计算,也可以看成是无符号计算,而不需要刻意的去想这是有符号计算还是无符号计算,关键在于你的需要:你是需要无符号计算还是有符号计算。如果你需要的是无符号计算,98(0110 0010)加99(0110 0011)结果为197(1100 0101),结果中所有的二进制位都看成是数值,没有符号位,此时只需要判断标志寄存器中的CF位和ZF位;如果你需要的是有符号计算,98(0110 0010)加99(0110 0011)结果为-59(1100 0101),此时二进制的最高位就是符号位(符号位为1,表示是负数,符号位为0,表示是正数),实际数值就是所有二进制位取反(00111010)再加1(00111011),算出数值为59,最后在前面加上负号,所以为-59。但我们计算的是98+99,如果看成有符号数计算的话,这个结果明显是不对的,所以此时就要查看标志寄存器中的SF位和OF位,以判断实际结果和逻辑结果的关系。
建议楼主可以先看看王爽老师《汇编语言》一书“附录”中有关“原码、反码、补码”的知识,另外把这一章再仔细看一遍。
以上分析希望可以帮到楼主!
2015-04-28 15:34
快速回复:请问到底什么时候才应该补码?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018309 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved