蒋文涛 发表于 2024-9-18 10:55:30

Keil C51 全局变量名称的改变会影响编译后的程序校验和吗?

请教社友确认一个问题:全局变量名称的改变会影响编译后的程序校验和吗?

开始我理解的知识点是不会影响编译后的程序校验和的。网搜的答案也是如此如下图:


但是,实际情况不是这样:全局变量名称的改变会影响编译后的程序校验和
比如:我只是为了可读性,做了如下变量名称改变,发现编译后的程序校验和变了:
g_CheckBatteryTimeCnt改为   g_RtcCheckBatteryTimeCnt 后

校验和就从139FD7 变为了 139FD6 .

请英文好的的社友帮搜一下,有没有Keil C51官方关于这个问题的答案。


小飞侠 发表于 2024-9-18 11:12:01

用比较工具比较一下生成的HEX文件,看看有啥区别

小飞侠 发表于 2024-9-18 11:14:21

Beyond Compare 比较好用

蒋文涛 发表于 2024-9-18 11:59:33

好,谢谢!找时间对比下,估计是变量存放的地址变了,校验码虽然不同了,但程序运行是正确的

health 发表于 2024-9-18 14:14:10

程序就一个全局变量吗?
先逐个编译c文件,然后是链接,在这一步骤要对所有的变量和代码分配地址,如果改名导致变量表的顺序变化,自然分配地址也就不同。
应该是按字母顺序排列吧。
你可以再试试改名但不改变命名顺序,看hex是否会变化。
例如变量名加后缀,或者变量名称a,b,d改成a,c,d,中间那个变量b改成c,不会影响三个变量的顺序。

蒋文涛 发表于 2024-9-18 15:42:28

health 发表于 2024-9-18 14:14
程序就一个全局变量吗?
先逐个编译c文件,然后是链接,在这一步骤要对所有的变量和代码分配地址,如果改名 ...

分别试过三个全局变量名称的改变,每次只改变一个变量名称,其余(顺序)不动的,其中,2个校验和改变了,有一个无论改变怎样的名称,都不会影响校验和。在keil中查看到汇编语言的窗口,可以确定,校验和改变的原因就是变量存放的地址会变化了,按怎样的规律分配存放地址只有编译器知道了,因该不会是简单的字母顺序。

目前,暂时能确定的就是,C语言源程序代码的状态是确定的时候,编译出来的校验和是确定的,不会随机变,以上的问题就不理会了。只能依赖编译器了,相信keil C51的编译不会有问题。不可能回到用汇编语言编程序了。

123 发表于 2024-12-27 09:57:30

可能是按变量名称顺序排序然后分配的,具体如何分配地址的建议咨询Keil总部,不要相信人工智障的回答。
页: [1]
查看完整版本: Keil C51 全局变量名称的改变会影响编译后的程序校验和吗?