注册 登录
编程论坛 汇编论坛

请问到底什么时候才应该补码?

ghhr6 发布于 2014-11-30 18:08, 7199 次点击
我看到了王爽的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 编辑 ]
3 回复
#2
不玩虚的2014-12-17 20:24
,你自己拿笔算算,看你的结果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 自己看看。
#3
取名字2015-04-28 15:34
对于楼主的问题,其实是不太清楚计算机中数据的表示,任何数据在计算机中都是用二进制表示的,且都是用补码表示的,只不过正数的补码就是它本身,而负数的补码是它的绝对值的所有二进制位取反然后再加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位,以判断实际结果和逻辑结果的关系。
建议楼主可以先看看王爽老师《汇编语言》一书“附录”中有关“原码、反码、补码”的知识,另外把这一章再仔细看一遍。
以上分析希望可以帮到楼主!
1