|
试了下a++ a+=1 ++a a=a+1。看汇编,结果挺有意思
[复制链接]
本帖最后由 liyancao001 于 2017-9-30 17:27 编辑
用的MPLAB X IDE V4.00 + XC8 V1.41
C如下:
AlarmNum++;
AlarmNum=AlarmNum+1;
++AlarmNum;
AlarmNum += 1;
汇编如下:
12982 ;Timer.c: 70: AlarmNum++;
12983 0271 0020 movlb 0 ; select bank0
12984 0272 30FC movlw 252
12985 0273 0ADC incf _AlarmNum,f
12986
12987 ;Timer.c: 71: AlarmNum=AlarmNum+1;
12988 0274 0ADC incf _AlarmNum,f
12989
12990 ;Timer.c: 72: ++AlarmNum;
12991 0275 0ADC incf _AlarmNum,f
12992 0276 0ADC incf _AlarmNum,f
可以发现有意思的是AlarmNum += 1;这句话在汇编中没了。。。。所以不清楚的小伙伴们注意了,以后就不要用+=了。
另外可以看到AlarmNum=AlarmNum+1;是最简单的,只用了一个指令周期。所以以后大家在PIC中还是用a=a+1吧。另外还有++AlarmNum,竟然执行了两次自加。。。。这个太坑了吧。
重新试了一遍:用的在线仿真看的,结果没有问题,都是2.
AlarmNum=1;
++AlarmNum;
AlarmNum=1;
AlarmNum+=1;
AlarmNum=1;
AlarmNum=AlarmNum+1;
AlarmNum=1;
AlarmNum++;
看汇编:
2348 ;main.c: 74: AlarmNum=1;
2349 0849 0020 movlb 0 ; select bank0
2350 084A 01DC clrf _AlarmNum
2351 084B 0ADC incf _AlarmNum,f
2352
2353 ;main.c: 75: ++AlarmNum;
2354 084C 0ADC incf _AlarmNum,f
2355
2356 ;main.c: 77: AlarmNum=1;
2357 084D 01DC clrf _AlarmNum
2358 084E 0ADC incf _AlarmNum,f
2359
2360 ;main.c: 78: AlarmNum+=1;
2361 084F 0ADC incf _AlarmNum,f
2362
2363 ;main.c: 80: AlarmNum=1;
2364 0850 01DC clrf _AlarmNum
2365 0851 0ADC incf _AlarmNum,f
2366
2367 ;main.c: 81: AlarmNum=AlarmNum+1;
2368 0852 0ADC incf _AlarmNum,f
2369
2370 ;main.c: 83: AlarmNum=1;
2371 0853 01DC clrf _AlarmNum
2372 0854 0ADC incf _AlarmNum,f
2373
2374 ;main.c: 84: AlarmNum++;
2375 0855 0ADC incf _AlarmNum,f
结果看编译出来的都是一样的了。。。。+=也能编译出来了。。。我晕了。
额,总之我以后是再PIC中只用a=a+1了。
又多试验了几次,发现每次编译出来的汇编指令还不一样,不过确实像第一个回复的网友说的,论证的不合理。应该是这个lst文件的显示问题,实际汇编出的指令与C指令是不能完全对应的。第一次测试的少了那个+=的汇编指令应该是++AlarmNum上多出的那条。。上面写的也不删了,正好给像我一样的新手看着玩吧。
总体上,这4中写法是一样的,但是有时候汇编出来的指令数不一定,但是结果目前没发现错误。
|
|