This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

IAR 2530 C代码的反汇编代码疑问?

Other Parts Discussed in Thread: CC2530, Z-STACK

各位好:

   我使用的开发环境是 IAR for 8051 8.30.3 , 在调试 CC2530F256 如下代码的时候,观察到的反汇编指令如图:

  // DI 定义为 P1_1                            	                  
 

右边汇编代码显示,一个左移位指令,和赋值语句, 用了这么多条指令,而且调试结果显示 DI = CY 这个赋值不成功(CY=1,但是赋值之后DI=0)

但是我使用 IAR for 8.10 重新测试这段代码发现,如下图, 明显效果比较好。 测试的时候 优化等级都为None。

请问,这是什么问题,有解决的办法吗?

  • 楼主,你咋不试试这样写呢?

    cmd<<=1;

    你再试试,你仔细对比两句采用不同运算符的效果,如果我没猜错,肯定就对应的汇编不一样了,机器都是按照语法来的。

    就像说话一样,说两句意思一样的话,结果用了不同的语法,那字数肯定就不同。

    还有前后不同的版本,估计默认的优化级别不同,上面那个看着就冗余度太高了。不知道系统咋处理的。

  • 你好,谢谢回复。

    1. C语言处理 cmd<<=1 与 cmd = cmd<<1是一样的,重新编译结果显示汇编代码一样。

    2. 两个版本的优化等级一样

  • 楼主,我用最新版生成的代码是

    EW8051-9103-Autorun版本。最新的,今天刚刚去IAR下载的。

    ---------------------------------------------------------------------------------------------------代码如下----------------------------------------------------------

          cmd<<=1;                //先发高       
       \   000012   EE           MOV     A,R6
       \   000013   C3           CLR     C
       \   000014   33           RLC     A
       \   000015   FE           MOV     R6,A
        112                  DI=CY;                               //取最高位               
       \   000016   A2D7         MOV     C,0xd0.7
       \   000018   E4           CLR     A
       \   000019   33           RLC     A
       \   00001A   F8           MOV     R0,A
       \   00001B   A2D7         MOV     C,0xd0.7
       \   00001D   9291         MOV     0x90.1,C
        113                  asm("NOP");
       \   00001F   00           NOP
        114                  DCKI=1;                                 //时钟下降沿,数据被传输
       \   000020   D290         SETB    0x90.0
        115                  cmd=cmd<<1;                         //先发高位        
       \   000022   EE           MOV     A,R6
       \   000023   C3           CLR     C
       \   000024   33           RLC     A
       \   000025   FE           MOV     R6,A
        116                  DI=CY;                               //取最高位    

    ---------------------------------------------------------------------------------------------------------

    对比内容,没有问题,估计是你那个版本的故障,或者bug,你去下载最新版试试看。9.103

  • 补充一下,我把那个优化等级调整后,发现生成的代码不同。好神奇啊

  • 我用了 9.10.2 效果还是那样,你用的是9.10.3 是正版呢还是 评估版?

  • hi, 你开了优化吗?

  • 我在官网下载的,然后注册了个序列号,是限制代码大小的序列号,你也可以注册个30天限制的。

  • 我用的是 9.10.2 版本,用到时30天试用,我待会安装最新版试试看

  • hi, 我最后使用和你一样的最新版本的size 限制版本,但是结果还是和之前一模一样,请问你有配置什么吗? 而且你的那句 DI=CY; 的反汇编代码也是冗余。

  • 我用的默认配置,是不是你修改配置导致的啊?DI=CY ;这句,估计跟头文件有关吧,我看编译后的名称都不同。我觉得不应该纠结这个,你这样完全是考察编译过程呢,只要编译后执行的结果达到我们的预期就行了。

  • 我用的是默认配置,执行结果确实不正确,这是最致命的,你有观察断点处引脚的输出是正确的吗?

  • 正确啊,我以前用CC2530开发产品的时候就没注意过这些编译细节,不过也没发现代码执行后出现跟我想法有出入的啊。比如你用Z-Stack开发,你还去考虑怎么编译成汇编吗?这个是不可能实现的。

  • 我测试的结果真的是错误的,CY赋值给DI (DI定义为: #define DI P1_1),但是 在CY=1时,赋值给 DI之后,DI是0;

    另外我咨询过 IAR的技术支持,他建议我用旧版。