. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->标志寄存器
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  汇编语言第225页,cmp ah,bh(有符号)比较的问题  [已解决] 回复[ 3次 ]   点击[ 327次 ]  
a82225269
[帖 主]   [ 发表时间:2011-04-13 00:34 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-02-27 03:22
如果sf=1,而of=1:
...
...
简单分析一下,就可以看出,如果因为溢出导致了实际结果为负,那么逻辑上真正的结果必然为正。
...
...
请问怎样推敲出sf=1,of=1必然有真实结果为正??和怎样推敲出如果sf=0,of=1那真实结果肯定为负??
chengdudefengche
[第1楼]   [ 回复时间:2011-05-22 18:15 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-05-11 17:26
首先这里的分析是针对 有符号的运算而言的

这个问题书上已经讲了,顺便吧补码看了就清楚了
betterpursuel
[第2楼]   [ 回复时间:2011-05-28 09:22 ]   [引用]   [回复]   [ top ] 
荣誉值:8
信誉值:0
注册日期:2010-11-07 17:01
首先,这些分析是针对有符号数的;
   其次,只有两个正数相加才能产生正溢出,只有两个负数相加才能产生负的溢出,一个正数和一个负数相加不会产生溢出,其他情况不予与考虑,因为计算机中用补码表示一个数,那么某数x,x-(+5)与 x+(-5)的计算结果肯定相同的,所以只考虑以上三种情况即可;
   最后,详细说明一下这两种情况“只有两个正数相加才能产生正溢出,只有两个负数相加才能产生负的溢出”;
   第一,说明一下“只有两个正数相加才能产生正溢出”;
以8位的数为例子,最高位为符号位;通过一些具体的例子或是思考,很容易得到这个结论:如果两个正数相加不溢出,那么所得结果的符号位为正;如果两个正数相加溢出,那么所得结果的符号位一定为负,其实逻辑上的结果的符号位应该为正;换句话就是“如果因为溢出导致了实际结果为负,那么逻辑上真正的结果必然为正”;
举一个例子(书上217页):
Mov al,98  ; 98 = 62H  = 0110 0010B   (原码)
Add al,99  ; 99 = 63H  = 0110 0011B   (原码)
逻辑上的结果为:98+99=197  (这个是正确的结果)
实际的结果为:  98+99=-59   (这个是错误的结果)
          0110 0010B    (原码)
        + 0110 0011B    (原码)
   -----------------------------------------------
          1100 0101     (符号位本应该为0,但是溢出导致符号为1,这个数逻辑上应该表示的是无符号是197,但是实际上进行的是有符号运算,当作有符号数它就是-59的补码)
比较一下:
197的原码是:0 1100 0101B        -59的原码是: 1011 1011B
197的反码是:0 1100 0101B        -59的反码是: 1100 0100B
197的补码是:0 1100 0101B        -59的补码是: 1100 0101B
即是:无符号数197的补码 与 有符号数-59的补码是相同的。
并且有这样的关系存在:   197 = -59 + 256 

第二,说明一下“只有两个负数相加才能产生负的溢出”;
以8位的数为例子,最高位为符号位;通过一些具体的例子或是思考,很容易得到这个结论:如果两个负数相加不溢出,那么所得结果的符号位为负;如果两个负数相加溢出时,那么所得结果的符号位是一定为正吗?换句话就是“如果因为溢出导致了实际结果为正,那么逻辑上真正的结果必然为负”这句话对吗?
举例子说明:
-126 的原码:1111 1110B  反码:1000 0001B  补码:1000 0010B
-1   的原码:1000 0001B  反码:1111 1110B  补码:1111 1111B
-2   的原码:1000 0010B  反码:1111 1101B  补码:1111 1110B
-3   的原码:1000 0011B  反码:1111 1100B  补码:1111 1101B
(-126) + (-1) = -127 没有溢出 即是:
   -126的补码:  1000 0010B
   -1的补码 :+  1111 1111B
------------------------------------------
  -127的补码: 1  1000 0001B (符号位为1,为负)
  
(-126)+(-2) = -128没有溢出 即是:
 -126的补码:  1000 0010B
   -2的补码 :+  1111 1110B
------------------------------------------
  -128的补码: 1  1000 0000B (符号位为1,为负)

(-126)+(-3) = -129 这时产生溢出 即是:
 -126的补码:  1000 0010B
   -3的补码 :+  1111 1101B
------------------------------------------
  -129的补码: 1  0111 1111B ((符号位本应该为1,但是溢出导致符号为0)
1 0111 1111B逻辑上是-129的补码,但是实际上是0111 1111B因为最高位为0,所以是正数,所以0111 1111B的原码、反码、补码都是相同的,这个数127;
即是:无符号数197的补码 与 有符号数-59的补码是相同的。
并且有这样的关系存在:   127 = (-129) + 256 或是 (-129) = 127 -256
a82225269
[第3楼]   [ 回复时间:2011-07-20 21:15 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-02-27 03:22
此贴由 贴主 于 [ 2011-07-20 21:15 ] 结贴。 结贴原因:问题已解决
得分情况:
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved