PIC中数据存储格式及原理

来源:互联网 发布:简单游软件下载 编辑:程序博客网 时间:2024/05/22 13:05
关于正负,为什么是第7位(更准确地说是最高位)是符号位,因为一个数据正负参半,即可以表示相同值的正负数,如0至7和0至-7。
关于PIC汇编中正负的比较,通常都是取一个字节的第7位是否为1,为0的就当大于为1的,其他部分就可不比较。
关于正负数的运算,乘法时不同符号位在汇编中可以直接相乘(如果数字比较大当然使用多个单元看成一个数据,建立函数即可,本文章说的这些函数都是在C语言编译好时自动生成的)。如0x28和0xFF13(-EDH)相乘,使用计算器(函数和计算器一个功能)得到27DAF8即为DAF8(即为-2508H),正确,故在乘法时无需判断符号位。

同理在加减时也无需判断符号位。

这可能是为什么单片机通常没有除法逻辑器的原因,因为除法时需要判断符号位!
在编译器自动生成的汇编函数中可以看到,函数判断的逻辑如下:
被除数的最高位异或除数的最高位(当然两个数的位数相同),判断被除数和除数是否为负数,如果为负数则将其取补(重点,都要用正数运算),然后调用除法指令运算,得出结果之后根据之前被除数最高位和除数最高位是否相同来决定结果是否需要取补(如果不相同则取补,如果相同则不取补)。

关于PIC中的STATUS中的C,此C和AVR中的C有所不同,因为PIC中的C在4-2=2之后C会置一,而AVR则相反地为0。因为PIC中的运算是4加上2的补码,即4加上0xFE,C肯定溢出。

关于汇编和C语言中的左移右移指令,正数无需讨论,因为左移便为乘以2,右移便为除以2(仅仅是16进制的乘除,16进制中没有小数点)。负数左右移原理,汇编使用RRNCF肯定会使最高位变成零,因为它不会去特意识别它是否为有符号数。而C语言中的“<<”和“>>”,对于有符号数来说使用“>>”时,会自动将最高位置回一,如0xFE即为-2,右移一位后变成0xFF即为-1,左移一位变成0xFC即为-4,所以汇编中应该要加上最高位或上一便可。


原创粉丝点击