. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->标志寄存器
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  P213页 倒数第二段,解释错误  [待解决] 回复[ 10次 ]   点击[ 818次 ]  
philmei
[帖 主]   [ 发表时间:2007-12-14 15:21 ]   [引用]   [回复]   [ top ] 
荣誉值:7
信誉值:10
注册日期:2007-11-26 03:32
--------------------------
原文:
mov ah,0A0H
mov bh,0CBH
cmp ah,bh
结果SF=1,运算(ah)-(bh)实际得到的结果是D5H,但是在逻辑上,运算所应该得到的结果是:160-(-53)=213。s记录实际结果的正负,所以SF=1。但SF=1不能说明在逻辑上,运算所得的正确结果。
--------------------------
首先将“s记录实际结果的正负”改为“SF记录实际结果的正负”。

我的分析:
这里有一处解释错误。

如进行的是有符号运算:
16进制表示为:A0-CB=D5 借了一位 CF=1 SF=1
10进制表示为:-96-(-53)=-43 未借位 CF=0 SF=1

如进行的是无符号运算:
16进制表示为:A0-CB=D5 借了一位 CF=1 不考虑SF
10进制表示为:160-203=43 借了一位 CF=1 不考虑SF
--------------------------
书中错误:
书中的160-(-53)=213是没有根据的。
fishboy
[第1楼]   [ 回复时间:2007-12-14 15:39 ]   [引用]   [回复]   [ top ] 
荣誉值:283
信誉值:0
注册日期:2007-06-26 11:42
“s记录实际结果的正负”改为“SF记录实际结果的正负”。 
=============
这个在勘误区中看到过,确实少了一个F。

书中的160-(-53)=213是没有根据的。
================
我想楼主没有读懂这一段话的意思。“sf=1不能说明在逻辑上,运算所得的正确结果”、“但是逻辑上的结果的正负,才是cmp指令所求的真正结果”。楼主在看看这两段的内容吧。

还有,要是保证有符号数的计算结果的正确性,操作数都要转化成补码的形式求得,此时的结果的形式也是补码。像提到的这几个计算,都不是正规看作有符号数的计算的,他们用的是原码的形式,自然计算结果会出问题。不过,书上的意思可不是楼主看到的这个意思。不妨在分析分析!
philmei
[第2楼]   [ 回复时间:2007-12-14 20:43 ]   [引用]   [回复]   [ top ] 
荣誉值:7
信誉值:10
注册日期:2007-11-26 03:32
谢谢您的提醒,不过我确实考虑了补码问题。

您看下我的分析对不对。

在进行无符号运算时,1个字节的取值范围是0-255。用16进制来描述就是0h-FFh
A0转成10进制时是160,CB转成10进制时是203,这没错吧?

当进行的是有符号运算时,1个字节的取值范围是-128至127。用16进制来描述就是80h-7Fh,(补码原理)
80h至FFh表示-127至-1;
0h至7Fh表示0至127;
那么在进行有符号运算时,A0-CB实际上就是-96-(-53),因为A0的补码是-96,CB的补码是-53

如进行的是无符号运算:
无需考虑补码问题
A0-CB转换成10进制是160-203,因为A0的10进制数是160,CB的十进制数是203
--------------------------
书中错误:
书中的160-(-53)=213是没有根据的。
--------------------------
我之所以说书中有错,是因为160是A0在无符号运算时的10进制的值,而-53是A0在有符号运算时的补码的值。书中这地方把这两个值弄到了一块,显然不对。213更是没来由。

书中这段的意思没有错,错就错在160-(-53)=213

如果真是我理解错了,请您指教。
fishboy
[第3楼]   [ 回复时间:2007-12-14 20:59 ]   [引用]   [回复]   [ top ] 
荣誉值:283
信誉值:0
注册日期:2007-06-26 11:42
160-(-53)=213 
============
说中说的意思是这个计算结果没有任何作用,也不是计算机真正的计算方式,同样,对于cmp指令没有任何意义。也就是说,书上没说这个式子除了式子本身之外在上下文中是正确。我不是说你理解别的知识有出入,我是觉得理解书中文字的意思好像不太对头。我是这个意思。
fishboy
[第4楼]   [ 回复时间:2007-12-14 21:38 ]   [引用]   [回复]   [ top ] 
荣誉值:283
信誉值:0
注册日期:2007-06-26 11:42
另外:
-53是A0在有符号运算时的补码的值
=============
A0作为有符号数时的补码是E0H。-53的补码是CDH。

在进行计算的时候,两个操作数都会被看成同一种形式,不会一个当作有符号数,一个当作无符号数,否则,计算结果别然出现误差。可是,机器在计算的时候都是将数据看作是无符号的,这也是为什么要用到补码的原因。补码能够使在都看作无符号数的计算过程中,保证结果的正确性,当然还要依靠标志寄存器的sf位。

看一下前面D5H,213==D5H。然后在想一下作者在说这些话的思路到底是想说明一个什么问题呢?160-(-53)=213 这个式子固然有问题,但是他出现的关键是作者在用另一个一个思维方式考虑一般思考路径。
我觉得没有什么问题。错误的结论也能支持正确的道理!我觉得作者是这么个思维过程吧。
当然,我也不是作者,也许我的理解有偏差!权当你我的交流一下。
philmei
[第5楼]   [ 回复时间:2007-12-15 01:27 ]   [引用]   [回复]   [ top ] 
荣誉值:7
信誉值:10
注册日期:2007-11-26 03:32
二楼的
“而-53是A0在有符号运算时的补码的值”
改为:
“而-53是CB在有符号运算时的补码的值”
我打错字了,但现在我清楚了,即便改后,我这种说法也是不正确的。

通过咱俩的辩论,我又有了新的认识。

首先,什么是补码?
答:补码是计算一个有符号数的实际值的方法。它是一种手段的名称,并没有实际的值。
应该这样叫:A0作为有符号数时的值是多少?

不知道您是怎样计算的?我感觉您的算法不对
A0作为有符号数时的值是多少?
CB作为有符号数时的值是多少?
D5作为有符号数时的值是多少?

=======================================================================
首先可以知道A0作为有符号数时,它的值表示的是一个负数
因为有符号数的取值范围是:80h-7Fh,即-128到127
我的计算方法:
1.先把A0换成2进制,A0h=10100000b
2.再把10100000b取反,为01011111b
3.再把01011111b+1b=01100000b,得出的这个数其实是A0作为有符号数的值的负数形式。因为取反了。
4.用10进制表示它,01100000b=96;当然也可以用16进制表示它,01100000b=60h.
60h相对于A0h是一个负数。其实A0h的值本身是负数,这里是相对关系。
所以书中有句话说的是:“负数的补码取反加1后,为其绝对值。”
这里,60h就是A0h作为有符号数时的值的绝对值。

即A0h作为有符号数时的值是:
16进制表示:A0h=A0h ; A0h的绝对值是60h
10进制表示:A0h=-96 ; -96的绝对值是96
2进制表示:A0h=-01100000b ; -01100000的绝对值是01100000
=======================================================================

因此,当进行有符号运算时
A0h=-96
CBh=-53
D5h=-43

当这些概念屡清楚后,再回过头来看俺俩讨论的问题。
160-(-53)=213确实错了。
应该改成:160-203=43
同样可以说明问题,因为在进行无符号运算时
A0的值是160
CB的值是203
D5的值是43
fishboy
[第6楼]   [ 回复时间:2007-12-15 11:51 ]   [引用]   [回复]   [ top ] 
荣誉值:283
信誉值:0
注册日期:2007-06-26 11:42
首先,我得承认我上面的计算补码的时候真的出了问题。把所有数据都当成了16进制的了(比如数-53中的53当成了53H了)。呵呵,太晕了!
我觉得我的想法和你的想法没在一条路上,总也没有什么碰撞。
我再组织组织我的思路,然后在继续讨论。
fishboy
[第7楼]   [ 回复时间:2007-12-15 12:49 ]   [引用]   [回复]   [ top ] 
荣誉值:283
信誉值:0
注册日期:2007-06-26 11:42
我终于看明白了,楼主说的是什么意思了!咱们好像讨论的问题有偏差,不是一个问题。
你是不是说,在计算过程中A0H和CBH没有按照统一的数据形式对待,A0当成了无符号数,CB当成了有符号数,造成了形式不一致。是不是?如果是的话,听听我的解释,如果不是的话,在当别论。

其实,计算的时候根本就没有什么有符号无符号的概念,都是按无符号数对待的(只不过是这个无符号数有时候是一个你根据一个有符号数计算出来的补码)。如书上说的“结果SF=1,运算(ah)-(bh)实际得到的结果是D5H” 这个结果,就是计算机得出的结果。由于结果的高位是1,所以,计算机认为这个数可以当作有符号数的负数,标志位SF被置了1。这个逻辑是计算机的逻辑。接下来就是你说的焦点了。
书上如此说“但是在逻辑上”,这个在逻辑上是指整个计算逻辑,包括计算过程中对CF的影响。这个逻辑相当于从后向前推的,从而推断出整个计算过程,再此再说一点,计算中没有有无符号的概念,都是无符号的计算逻辑。首先,由于CF置1了,在之前的计算过程中有过借位行为,所以从逻辑上推理整个计算过程应该是A0H+100H-CBH(其中100H是借位得到的1 0000 0000B),上面的式子可以写为A0H-(CBH-100H)= A0H-(-35H)=160-(-53)=213 。也就是书上说的那个式子。
我觉得有两个关键点:
1.计算机中的计算没有符号的概念,一律都是无符号操作。(有符号数需要装换成响应的无符号概念的补码来进行计算,而有符号之说是人来表达的。计算机对于某一个寄存器中存放的数据判断的时候,如果该数据的最高位[这个最高为跟寄存器有关]是1,就会将SF=1,但是SF=1不能代表这个数据就是负数,如果认为是负数了,那么此时的数据应该为那个负数的补码)
2.书中所说的“在逻辑上”,是指计算的整个过程,这个过程是一个无符号数据间的正规计算逻辑。就像0-1,计算机不能计算出-1,因为在任何时候这种计算都能够借位,从而成为0+1*(借位代表的值-1 这样的计算表达式,这个表达式才是所说的“在逻辑上”的计算过程。

不知道,我这么说是不是跟楼主说的问题搭上了?
philmei
[第8楼]   [ 回复时间:2007-12-15 16:51 ]   [引用]   [回复]   [ top ] 
荣誉值:7
信誉值:10
注册日期:2007-11-26 03:32
您说的很对,我是这个意思,书中把无符号时的值与有符号时的值弄在一起计算了。

计对您提出的思路,我觉得在做无符号运算时不应该把CF加进除数和结果。
首先我在上文中的贴子中又有1个致命错误,我以前没注意
160-203=-43
这样就没错了。
我错在160-203=43了。
-43对应的是D5没错。

所以在A0h-CBh=D5h这个式子中
无论是按无符号或有符号运算都解释的通
无符号时:
A0h=160,CBh=203,D5h=-43
有符号时:
A0h=-96,CBh=-53,D5h=-43
结果都是-43,也就是说结果是一样的
对于计算机来说,它不管三七二十一,A0h-CBh就是等于D5
差别在于使用者,

咱们当它是无符号运算的话,在逻辑上,运算所应该得到的结果是:160-203=-43
因为计算机无法用负号表示一个数,因此CF的概念就出来了
运算结果为D5h,借了一位,CF=1
D5的10进制是213,但这个213并不是A0h-CBh的结果的全部,因为CF还=1呢
由于计算机这种只认正不认负的原则,咱们才定义出了补码原理。

咱们当它是有符号运算,那么就要看SF是多少了,在这个问题中,SF=1
这个SF=1说明了,结果D5h为-43,要将D5h当作有符号数
而OF=0,说明了没有造成溢出
在这个例子中,SF=1说明了结果为负,因为OF=0

如果OF=1,那么,SF就不能准确的说明结果为正或为负了。
比如80h-10h=70h会造成溢出,OF=1,SF=0
80h=-128,10h=16,70h=-144(-144是70h在作为有符号数时的值)
但计算机不认识-144,计算机只知道70h=112
计算机认为70h是个正数,因此SF=0,依照SF的意思结果应该是个正数,
而逻辑上结果是-144,是个负数。这都是溢出造成的。
所以书上说,“SF=1不能说明在逻辑上运算所得的正确结果。”因为要考虑OF的值

无论怎样,书中说160-(-53)=213是错误的表示
160是A0h在无符号时的值
-53是CBh在有符号时的值
213是D5h在无符号时的值

很明显不对。

您说呢?
fishboy
[第9楼]   [ 回复时间:2007-12-15 18:29 ]   [引用]   [回复]   [ top ] 
荣誉值:283
信誉值:0
注册日期:2007-06-26 11:42
您说的很对,我是这个意思,书中把无符号时的值与有符号时的值弄在一起计算了。
==================
书中没有混在一起说。书中说160-(-53)=213应该应该只是省略了“A0H-(CBH-100H)= A0H-(-35H)=”这个步骤。不是你想的那样把不无符号数和有符号数的值弄在一起了!

计对您提出的思路,我觉得在做无符号运算时不应该把CF加进除数和结果。
================================
计算机才不知道你有没有高位数据,只要你不够就要借位,只要对CF做出标记就算完成了自己的行为。


我在7楼已经把我的理解方式完完全全的说出来了。你如果还是认为那是作者的犯的低级错误,我想我也没有什么再能跟你讲的了,也没法再讲了。你就按你的想法吧,我保留我的看法。不过,有时间希望你再回过头来思考一下吧。

最后我在说一句,计算机没有思维,只有过程。
taotling
[第10楼]   [ 回复时间:2008-03-02 20:19 ]   [引用]   [回复]   [ top ] 
荣誉值:53
信誉值:0
注册日期:2008-02-09 02:55
我觉得对于A0H-CBH来说,我们如果非要写,写成什么10进制的运算都无所谓,
只要A0H是被减数,CBH是减数就成,至于把它们同时看成有符号数也好,
不同时看成有符号数也好,都不会影响计算机的最终结果。

但既然写在这章的这里,还是写成有符号运算的表示方式比较合适,
因为既然书里提到无符号运算和有符号运算,
那么最好在举例的时候按照有无符号运算的方式区分,
这至少让学习的人少些迷惑。

再来看作者要把A0H-CBH表达成:160D-(-53D)=213D的正确与否。
至于为什么可以表达成160D-(-53D)=213D可以参看我后面的举例。

如果改成了无符号运算的表示方式:160D-203D=-43D=D5H。
D5H表示成一个无符号数是213D。可是SF却被置为1,表面上这也可以说明“只靠SF=1是不能推断计算机结果和我们的现实运算结果相符”这句话。
但是书上P204说了“如果我们将数据当作无符号数来运算,SF的值则没有意义,虽然相关的指令影响了它的值。”
那说明这里我们如果把计算看成是无符号运算,SF是否为1对我们要从SF的值推断相关计算结果的正确性是没有帮助的,因为SF对无符号运算没有意义。
书上举A0H-CBH这个例的初衷是想说明在SF值有意义的情况下,通过SF=1是否能推断结果的正确性。

那么要想使SF的值有意义,就要使得运算应该是有符号的运算,
所以这里作者应该写成有符号的运算形式:-96D-(-53D)=-43D,
这时候SF的值是有意义的。
但是这个有符号运算的结果-43D=D5H,这与计算机计算结果是相同的,
也就是说作者如果要写成-96D-(-53D)=-43D这样的有符号运算形式,
并不能达到他推论书上原话"SF=1不能说明在逻辑上运算所得的正确结果。”这一目的,

因为这里的有符号运算情况下,SF=1了,有符号运算的结果与现实计算的结果也相同了。
所以,作者在专注于推论的情况下,忘记了区别有无符号运算的问题。
为了说明问题,作者就把A0H-CBH表达为:160D-(-53D)=213D来进行推论。这样的情况下我们想要的真正结果为213D,而SF却为1了。对于160D-(-53D)=213D这个写法,本身并没有什么错误,但放在这里作为例子,我觉得却是不可以的,因为说明不了问题。因为把A0H看成一个无符号数,而又把CBH看成一个有符号数,他们之间进行运算,尽管最终计算机的结果都一样,但我们到底把这看作是一个有符号运算,还是一个无符号运算?或许有人会说,有无符号计算是人为的想的,计算机不管。那么书上P204说了“如果我们将数据当作无符号数来运算,SF的值则没有意义,虽然相关的指令影响了它的值。”    这句话说明SF对我们要有意义,那我们就得进行有符号运算。

上面,如果将"A0H-CBH"改为"78H-CBH"也就是+120D-(-53D)=173D就可以达到作者的目的了。
因为看作有符号运算,我们的实际计算结果为173D,为正数,而计算机结果为ADH=1010 1101B,
因为1010 1101B最高位为1,从而SF=1。这里的SF=1对我们来说是有意义的。
这样就说明了“SF=1不能说明在逻辑上运算所得的正确结果。”这一句话。
其实“SF=1不能说明在逻辑上运算所得的正确结果。”这句话作者在这个例子之前的例子"22H-A0H"中就已经证明了正确性,只不过是想多举一个例子来让大家更清楚而已。


那么A0H-CBH为什么可以写成160-(-53)=213
我想举下面的例子,大家可以看看对不对:
比如DEH与A0H进行8位的运算,
DEH=11011110B,十进制可以看作是222D或-34D
A0H=10100000B,十进制可以看作是160D或-96D

首先看他们的补码加法运算:
     11011110B
 +  10100000B
= 1 01111110B
这里的1算作进位记CF=1,或许我们说算溢出,OF=1也行。
再来看十进制的加法运算:
十进制的加法运算可以有如下组合:
222D+160D=382D     对应的16位补码:0000 0001 0111 1110B;对应的8位补码:0111 1110B
222D+(-96D)=126D   对应的16位补码:0000 0000 0111 1110B;对应的8位补码:0111 1110B
-34D+160D=126D     对应的16位补码:0000 0000 0111 1110B;对应的8位补码:0111 1110B
-34D+(-96D)=-130D  对应的16位补码:1111 1111 0111 1110B;对应的8位补码:0111 1110B
从所取的8位补码来看,不管你把被加数和加数人为的看作10进制的有符号数还是无符号数,
中间的过程不管是什么,计算机最后所取到的这个8位的结果都一样。
也就是说你所看成的各种加法计算,计算机都只用一种计算给出结果那就是:
11011110B +  10100000B = 01111110B

他们之间的减法,同样是这个道理。

这个例子说明了为什么书上A0H-CBH可以写成160-(-53)=213的原因。  


另外,我觉得fishboy的分析忽略了作者在这里举例的目的是什么。
而是重点去说A0H-CBH写成160-(-53)=213的对错问题。
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved