5794|2

96

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

试了下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中写法是一样的,但是有时候汇编出来的指令数不一定,但是结果目前没发现错误。
此帖出自单片机论坛

最新回复

对你表示挺无语的 这几个语句单独使用的话,效果是一模一样的 是你论证不到位,得出了错误的结论,最后选了一个最不常用的写法   详情 回复 发表于 2017-9-30 17:14
点赞 关注
 

回复
举报

6040

帖子

205

TA的资源

版主

沙发
 
对你表示挺无语的
这几个语句单独使用的话,效果是一模一样的
总之我以后是再PIC中只用a=a+1了
是你论证不到位,得出了错误的结论,最后选了一个最不常用的写法
此帖出自单片机论坛

点评

原来的结论却是不对,应该是lst文件中C和汇编对应的不好让我想错了。。  详情 回复 发表于 2017-9-30 17:26
 
 

回复

96

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
lcofjp 发表于 2017-9-30 17:14
对你表示挺无语的
这几个语句单独使用的话,效果是一模一样的
是你论证不到位,得出了错误的结论,最后选 ...

原来的结论却是不对,应该是lst文件中C和汇编对应的不好让我想错了。。
此帖出自单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表