keil C51 编译器优化问题
本帖最后由 李维强-15级 于 2016-1-17 12:28 编辑最近做个GPS,但是遇到个奇葩问题,最基本的C51问题
看到了么? 给一个数赋值,结果不是按个数。
最后仔细分析,这个是编译器优化的结果。
如果把优化等级变为0 就不会出现这种情况了,所有正常运行,设置如下图
但是这样一来,代码量就要增加。上图同样的工程,选择8级优化,结果如下图,程序区是不是减少了2K左右?
下面说一下为什么会出现这种情况?
最开始我和顾老师研究了半天,也没有研究个所以然出来,最后看看汇编代码来解释,如下图
看到编译器只把1000这个16位数的低8位赋值给了变量。为什么会这样?原因是我下面那行代码,编译器知道我下面一行的操作是左移8位,所以高8位本来就没有用的,这样就减少使用1个寄存器,优化了代码。
总结起来就是编译器很聪明,正式这样的聪明才达到了优化代码的效果。所以在仿真的时候,不要相信watch窗口里面的变量值,这会使得你的判断失误。
我们把代码改了试试,同样是赋值,这下赋值1000就正确了。
赞一个,把编译器在这里具体是怎么优化的讲的很清楚。这里如果选用了较高的优化等级,上文中如果将aal变量打印输出到串口中,值是1000还是232呢 PS:我也在用SIM808开发一个3G数传,欢迎交流 写代码把.c 文件包含到.c文件有什么好处吗 程浥 发表于 2016-1-18 15:09
写代码把.c 文件包含到.c文件有什么好处吗
个人觉得没什么好处 ,这个是人家的例程我在这个上面改的
还是把函数写在头文件里面,包含头文件比较靠谱,规范些,他这个我费了很多力才调试通过,乱七八糟的,不好看 张金权-11级电子 发表于 2016-1-18 10:16
赞一个,把编译器在这里具体是怎么优化的讲的很清楚。这里如果选用了较高的优化等级,上文中如果将aal变量 ...
欢迎,欢迎
正需要
要不我另外开一贴 来里面留言吧。 李维强-15级 发表于 2016-1-19 08:05
欢迎,欢迎
正需要
要不我另外开一贴 来里面留言吧。
这个可以有,哈哈
页:
[1]