先看无符号数的比较大小。
想要比较两个“无符号数”的大小,那是很简单的。
先把它们两个相减,然后就可以根据标志位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 单元了。可以多试几次,用不同的数值进行实验。
实践可以证明,上述的程序是正确的,并且也是最简短的。