由于PIC片内RAM仅几十个字节,空间特别宝贵,而Mplab-C编译器对RAM地址具有不释放性,即一个变量使用的地址不能再分配给其它变量。如RAM空间不能满足太多变量的要求,一些变量只能由用户强制分配相同的RAM空间交替使用。而Mplab-C中的乘除法函数需借用RAM空间来存放中间结果,所以如果乘除法函数占用的RAM与用户变量的地址重叠时,就会导致出现不可预测的结果。如果C程序中用到乘除法运算,最好先通过程序机器码的反汇编代码(包含在生成的LST文件中)查看乘除法占用地址是否与其它变量地址有冲突,以免程序跑飞。Mplab-C手册并没有给出其乘除法函数对具体RAM地址的占用情况。例5是乘法函数对0×13、0×14、0×19、0×1A地址占用情况。
例5
|
部分反汇编代码
|
#include <pic16c71>
|
01A7
|
081F
|
MOVF 1F,W
|
#include<math.h>
|
01A8
|
0093
|
MOVWF 13
|
|
;借用
|
|
|
unsigned long Value @0x1
|
01A9
|
0820
|
MOVF 20,W
|
char Xm @0x2d;
|
01AA
|
0094
|
MOVWF 14
|
|
;借用
|
|
|
void main()
|
01AB
|
082D
|
MOVF 2D,W
|
{Value=20;
|
01AC
|
0099
|
MOVWF 19
|
|
;借用
|
|
|
Xm=40;
|
01AD
|
019A
|
CLRF1A
|
|
;借用
|
|
|
Value=Value*Xm
|
01AE
|
235F
|
CALL 035Fh
|
|
;调用乘法函数
|
……
|
01AF
|
1283
|
BCF 03,5
|
}
|
01B0
|
009F
|
MOVWF 1F
|
|
;返回结果低字节
|
|
01B1
|
0804
|
MOVF 04,W
|
|
01B2
|
00A0
|
MOVWF 20
|
|
;返回结果高字节
|
|