这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » ICC ICC的一点疑问

共2条 1/1 1 跳转至

ICC ICC的一点疑问

院士
2006-09-17 18:14:16     打赏
ICC ICC的一点疑问



关键词: 一点     疑问    

院士
2006-12-22 22:43:00     打赏
2楼
问 首先,对于C编译后的汇编代码有:
_TV_ChannelDirectChoose:
  tmpDBL               --> R12
  tmpDBH               --> R10
  tmpEepromAddr        --> R12
  tmpPB                --> R22
  TheChannelNum        --> R20
    0213 D509      RCALL    push_gset4
    0214 2F40      MOV    R20,R16
    0215 9723      SBIW    R28,3
前面的-->是指变量所存放的寄存器位置?是的话,怎么没什么规律?而且有两个一样的?!!,不是的话是指什么?<tmpXXXX都是局部变量,TheChannelNum是参数>
还有个,也跟上面有关系,就是我定义了局部变量之后,其值可能是0,可能不是0,那么不是每次都要unsigned char tmpPB = 0;???? C中不用如此麻烦吧? 1: 我表述的不清楚还是太简单了?各位?
我手头上有本<AVR单片机C语言开发入门指导>,沈老师的,里面有对ICC的比较详细的介绍,但上面所说的我却没在书中找到有阐述的.:( 2: 又发现个问题在C中,func(tmp++)函数先取tmp值执行函数体,再执行tmp++.
但再icc中我一个函数编译完出来的是这样:
(0103)     EEPROM_Write(EepromAddr++,WaveBand);
    013F 2F26      MOV    R18,R22
    0140 011A      MOVW    R2,R20
    0141 5F4F      SUBI    R20,0xFF
    0142 4F5F      SBCI    R21,0xFF
    0143 0181      MOVW    R16,R2
    0144 DFDB      RCALL    _EEPROM_Write 3: 是优化的结果  不同的变量编译后的地址是同一个寄存器,是编译器的优化的结果。当定义的变量在后面没有用到时,编译器就会将其优化。如果你发现定义不同的变量占用同一寄存器,你可以在后面的程序中使用其中一个变量,再编译你就会发现它们占不同的地址。
  局部变量定义时其值是随机的,全局变量定义时赋初值0。
  现在改用IAR了,你说的第三个问题我没有遇到过。 4: 谢谢zzhangyj的解释帮我弄懂了些疑问.谢了! 5: 函数调用时实参是未加1时的数据,没问题你的函数参数在R16,而加1存在了R20,函数调用时实参是未加1时的数据,没问题 6: 不用客气不用客气,大家共同提高嘛! 7: 确如zoyou所说.翻看了一下ICC中关于寄存器的分配的介绍,再认真看过lst文件,func(parama++)确实是这样,编译器没错的!

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]