各位好:
我使用的开发环境是 IAR for 8051 8.30.3 , 在调试 CC2530F256 如下代码的时候,观察到的反汇编指令如图:
// DI 定义为 P1_1
右边汇编代码显示,一个左移位指令,和赋值语句, 用了这么多条指令,而且调试结果显示 DI = CY 这个赋值不成功(CY=1,但是赋值之后DI=0)
但是我使用 IAR for 8.10 重新测试这段代码发现,如下图, 明显效果比较好。 测试的时候 优化等级都为None。
请问,这是什么问题,有解决的办法吗?
gaoyang9992006:
楼主,你咋不试试这样写呢?
cmd<<=1;
你再试试,你仔细对比两句采用不同运算符的效果,如果我没猜错,肯定就对应的汇编不一样了,机器都是按照语法来的。
就像说话一样,说两句意思一样的话,结果用了不同的语法,那字数肯定就不同。
还有前后不同的版本,估计默认的优化级别不同,上面那个看着就冗余度太高了。不知道系统咋处理的。
Jiancan Chen:
回复 gaoyang9992006:
你好,谢谢回复。
1. C语言处理 cmd<<=1 与 cmd = cmd<<1是一样的,重新编译结果显示汇编代码一样。
2. 两个版本的优化等级一样
gaoyang9992006:
回复 Jiancan Chen:
楼主,我用最新版生成的代码是
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
gaoyang9992006:
回复 gaoyang9992006:
补充一下,我把那个优化等级调整后,发现生成的代码不同。好神奇啊
Jiancan Chen:
回复 gaoyang9992006:
我用了 9.10.2 效果还是那样,你用的是9.10.3 是正版呢还是 评估版?
Jiancan Chen:
回复 gaoyang9992006:
hi, 你开了优化吗?
gaoyang9992006:
回复 Jiancan Chen:
我在官网下载的,然后注册了个序列号,是限制代码大小的序列号,你也可以注册个30天限制的。
gaoyang9992006:
回复 Jiancan Chen:
没有开优化。
Jiancan Chen:
回复 gaoyang9992006:
我用的是 9.10.2 版本,用到时30天试用,我待会安装最新版试试看
Jiancan Chen:
回复 gaoyang9992006:
hi, 我最后使用和你一样的最新版本的size 限制版本,但是结果还是和之前一模一样,请问你有配置什么吗? 而且你的那句 DI=CY; 的反汇编代码也是冗余。