单片机的加减法原理
是负数,也就是说不够减,例如 2-3 = -1
这个运算在单片机里面究竟是怎么进行的呢?其实也很简单,记住我们的信条:“单片机里面都是补码运算”那么很自然的化成 2 + (-3),求出 2 和 -3的补码并进行运算
0000 0010
+ 1111 1101
--------------------------
0 1111 1111
进位位C = 0表示减法运算发生错位,结果是 0b11111111,这就是最终结果了。
但是这个值我们要看的懂,必须变化为原码,说过了,这是一个补码,最高位为1表示这是一个负数,所以求原码的办法,也是将补码取反再加一,也就是
0b11111111 à 0b00000000+1 à 0b00000001
这个就是我们最终的结果,是一个负数,绝对值为1,也就是说结果为 -1
这跟我们期待的结果是一模一样的。EMC单片机仿真代码以及结果:
mov a,@2
mov 0x20,a
mov a,@3
sub 0x20,a
寄存器0x20的值为 0xff,进位C=0表示减法发生了错位,Z=0表示结果非零。
这完全和我们分析的吻合。再强调,单片机里面出现的都是补码,所以这结果的 0xff 也是补码,想看懂得转化为原码。上面已经说了转化办法。
另外,我们需要分开来看,我们上面是说将这个数字看成是“有符号数”,2-3=-1这个是我们要的结果,但是,如果我们把这个数看成是“无符号数”那又该怎么办呢?
办法就是,借位,跟我们手工减法一样,不够减就向高位借位。
2-3 = 0010 – 0011 这是不够减的,那么 2应该向高位借一,变成 10010 – 0011 = 1111,这里扮演高位的其实就是进位C,也就是说C=0时是发生错位的,为什么?因为这个C=1被被减数借去用了,结果为 0xff ,这个时候 0xff 就是我们想要的结果,不需要变化,因为我们不是看成有符号数。
5, 两个数比较大小 CMP A , B
两个数比较大小,记得以前微机原理的老师给我们说了,本质就是做减法运算,然后判断标志位。EMC单片机没有CMP比较指令,但是我们通过减法指令可以达到目的,从本质上说,那是一致的。
因为这些逻辑判断是固定的,而且比较繁琐,容易出错,所以是建议做成宏调用,这样跟其他单片机上面的 CMP指令是一样使用的,比较方便。
(1)A>B
A-B >0 我们一定要强调顺序,也就是说,谁减去谁 的问题,不能搞乱。A-B操作之后PSW的标志位状态
C=1表示没有借位,Z=0 表示结果不为0
(2)A=B
C=1 表示没有借位,Z=1表示结果为0
(3)A
C=0 表示借位,Z=0表示结果不为0
那么很简单推导出另外两个常用的关系:
(4)A >= B
C=1 或者 Z=1,通过Z能判断是否相等。
(5)A <= B
明显这里是或关系C =0 或者 Z=1 都满足条件判断。
(6)A != B
很简单,只需要 Z=1 就能满足要求
根据这5个关系,写成5个常用的宏,将给程序编写带来非常大的方便。具体实现代码在EMCLIB库里面/arch/generic.dt里面。
单片机加减法原 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)