如何利用单片机来比较两个有符号数的大小

题目:设内部ram从30h,31h单元中存放有两个有符号数,试比较它们的大小,将较小的数存放在30h单元,较大的数存放在31h单元中。
理解:对于两个有符号数x,y,不外乎有四种情况,即(正,负),(负,正),(正,正),(负,负)。所有程序里就这四种情况进行讨论就行了。
org 0000h
ljmp main
org 0040h
main: mov 30h,#95h
mov 31h,#96h
mov a,30h
cjne a,31h,cmpt
sjmp $ ;两个数相同,不用交换
cmpt: jb acc.7,cmpt1;(30h)《0,跳到cmpt1
mov a,31h ; (30h)》0,判断(31h)正负
jnb acc.7,cmpt2 ;(30h)》0,(31h)》0,跳到cmpt2
mov 31h,30h ;(30h)》0,(31h)《0,(30h)》(31h),则交换
mov 30h,a
sjmp $
cmpt1: mov a,31h
jb acc.7,cmpt1_1 ;(31h)《0,则跳到cmpt1_1
sjmp $ ;(30h)《0,(31h)》0,则(30h)《(31h),不用交换
cmpt1_1: cpl a ;(30h)《0,(31h)《0,则要把他们数值位取反加1,得到数值位的真实值
add a,#1
mov r1,a
mov a,30h
cpl a
add a,#1
subb a,r1
jc exchange1 ;c=1,即30h中数值位小于31h的数值位,所以(30h)》(31h),故交换(其实两个负数比较大小,
可以当做无符号数来直接相减,然后判断c进行相应处理,有空再改改)
sjmp $ ;c=0,即30h中数值位大于31h的数值位,所以(30h)《(31h),不用交换
exchange1: mov a,30h
mov 30h,31h
mov 31h,a
sjmp $
cmpt2: subb a,30h ;(31h)-(30h)
jc exchange2 ;c=1则跳,即(30h)》(31h)时跳
sjmp $ ;c=0时,即(30h)《(31h)时不用交换
exchange2:mov a,30h
mov 30h,31h
mov 31h,a
sjmp $
end
ps:其实51单片机里的指令处理的都是无符号数的,指令对所有的数据都看成是无符号数,所以不能通过指令来直接比较两个有符号数的大小,而要自己编程实现。其实这个问题好像很少有书本提到的,晕,还是自己理解错了?现在学的单片机那本教材更是有很多错误的,还是自己学校的老师编的教材。其实我这个程序已经写得很详细的了,写的这么详细原因是可以帮助读者理解下有符号数和无符号数的区别。
来源;21ic

手机的OLED屏真的伤眼睛吗
基于单片机的直流伺服电机控制系统设计
MEAS测试测量传感器应用市场
便携式太阳能电池测试仪系统设计解析
力矩电机控制器输出电压是多少
如何利用单片机来比较两个有符号数的大小
中科院院士张钹在演讲中探讨了校企融合与共同培养创新型和应用型AI人才培养
碳酸钙水分测试步骤及注意事项
利用无人机开展飞行防控病虫害,大大提高春耕效率
互联大数据时代带给报警运营处警的变化
准备取代Mini ISO的超紧凑型继电器
2019智能家居的发展趋势分析
新时达官宣注销两家机器人公司 为何注销
360度全景环视和自动泊车系统
无界限设计加持!魅族手环正式亮相
音王推出智能音视频系统整体解决方案
锂离子电池的组装过程
爱玛科技:6名财务如何高效完成数百家供应商的对账协同?
realme真我GT定价小于2999元
电脑显示器的选购技巧分享