2909|2

59

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

c51在keil中调试出现的问题,估计与编译有关,请教 [复制链接]

变量取值的问题

  1. void main()
  2. {
  3. unsigned int a1;
  4. unsigned int b1;
  5. unsigned char h;
  6. unsigned char l;
  7. a1=0xab12;
  8. l=a1;
  9. b1=(a1&0xff00)/256;
  10. h=b1;
  11. }
复制代码


用KEIL调试时发现,a1变量中的值没有赋成ab12h,而只是赋成0012h.程序改成如下后,a1的赋值就正确了:

  1. void main()
  2. {
  3. unsigned int a1;
  4. unsigned int b1;
  5. unsigned char h;
  6. unsigned char l;
  7. a1=0xab12;
  8. l=a1;
  9. a1=a1>>8;
  10. h=b1;
  11. }
复制代码

请教这是什么原因呢?

这个是反汇编的结果:

  1. 3:  
  2.      4:         unsigned int a1;
  3.      5:         unsigned int b1;
  4.      6:         unsigned char h;
  5.      7:         unsigned char l;
  6.      8:         a1=0xab12;
  7.      9:         //l=(unsigned char)a;
  8. C:0x000F    7F12     MOV      R7,#0x12
  9. C:0x0011    7EAB     MOV      R6,#0xAB
  10.     10:         l=a1;
  11.     11: //      b1=(a1&0xff00)/256;
  12. C:0x0013    8F0B     MOV      0x0B,R7
  13.     12:         a1=a1>>8;  
  14.     13: //      h=(unsigned char)a;
  15. C:0x0015    EE       MOV      A,R6
  16.     14:         h=a1;
  17.     15:  
  18. C:0x0016    F50A     MOV      0x0A,A
  19.     16: }
  20. C:0x0018    22       RET         
复制代码

如上,上述程序在编译时,多了这句:
C:0x0011    7EAB     MOV      R6,#0xAB
我是在keil uvision2是编译的。

最新回复

如上,上述程序在编译时,多了这句: C:0x0011    7EAB    MOV      R6,#0xAB 这个明显是优化的结果 省掉了你的那几个变量 直接把真实的结果放到寄存器中,因为你的那两个变量没有用上 这样,你在变量前加volatile看看 不让编译器对变量访问优化 应该就OK了   详情 回复 发表于 2009-7-25 16:51
点赞 关注

回复
举报

69

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
uvision2会根据你的程序进行优化编译,并非直译,所以有些不必要的在反汇编中就没有了。
 
 

回复

89

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
如上,上述程序在编译时,多了这句:
C:0x0011    7EAB    MOV      R6,#0xAB

这个明显是优化的结果

省掉了你的那几个变量

直接把真实的结果放到寄存器中,因为你的那两个变量没有用上

这样,你在变量前加volatile看看

不让编译器对变量访问优化

应该就OK了
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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