比较有符号数的大小

先看无符号数的比较大小。

想要比较两个“无符号数”的大小,那是很简单的。

先把它们两个相减,然后就可以根据标志位Cy来判断了。

当Cy=0,说明没有借位,那么就是被减数大;当Cy=1,就是有借位,那么就是被减数小。


想要比较两个“有符号数”的大小,那可就麻烦了。

也是先把它们两个相减,但是后来要根据“差的正负”和“溢出标志位OV”来判断。

当差是正数,能肯定是被减数大吗?

这还不行,只有在没有溢出的时候,才能肯定是被减数大。
如果出现了溢出,说明符号是“反”的,差是正数,反而是被减数小。

当差是负数,在没有溢出的时候,肯定是被减数小;如果出现了溢出,则是被减数大。

上述的说法,可以参考微机原理教材中条件转移指令:JG、JL 的说明。

51 单片机中,没有 JG、JL 这样一次性判断两个标志位的指令,只能使用两次转移指令,分别判断 ACC.7 和 OV。


下面看一个题目:
http://zhidao.baidu.com/question/331964563.html#)
;---------------------------------
51单片机,两个有符号数分别在50H和51H里面,比较他们的大小,把大的放入60H单元。
悬赏分:20
;---------------------------------
答案:

;比较有符号数的大小,可以先进行一次相减,
;再根据差的正负、是否溢出,来区分大小。
;程序如下:
;
        ORG   0000H
        MOV   50H,  #-28 ;先随便存入两个数字.
        MOV   51H,  #108
;========================================
BIJIAO:                  ;开始比较.
        MOV   A,  50H
        CLR   C
        SUBB  A,  51H    ;(50H)-(51H)
        JZ    DA_50H     ;差为0转移.
        JB    ACC.7, FU  ;负数转移.
        JB    OV, DA_51H ;有溢出转移.
        SJMP  DA_50H     ;正数且无溢出,转到(50H)大.
;----------------------------------------
FU:     JB    OV, DA_50H ;负数且有溢出,转到(50H)大.
;----------------------------------------
DA_51H: MOV   60H, 51H   ;(51H)大的处理程序.
        SJMP  BJ_END     ;转到结束.
;----------------------------------------
DA_50H: MOV   60H, 50H   ;(50H)大的处理程序.
;----------------------------------------
BJ_END: SJMP  $          ;比较程序结束.
;========================================
END

调试上述程序,可看到 108 被送到 60H 单元了。可以多试几次,用不同的数值进行实验。
实践可以证明,上述的程序是正确的,并且也是最简短的。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值