[C语言] Keil的c语言编译器

[复制链接]
 楼主| functions 发表于 2019-10-21 10:52 | 显示全部楼层 |阅读模式
    我曾经通过查看反汇编代码对KEILC编译器进行了测试,大概有这么一下内容,也得出一些结论。
 楼主| functions 发表于 2019-10-21 10:53 | 显示全部楼层
(1)全局变量:如果程序中定义了全局变量,而且初始值不是0。此时,在程序调到main()函数执行前,除了要进行内存清零、初始化堆栈外,还需要将全局变量的初始值加载到内存的指定区域(编译过程中为全局变量分配的空间)。
 楼主| functions 发表于 2019-10-21 10:53 | 显示全部楼层
(2)局部变量:局部变量通常使用那些缓冲内存(用作保存运算过程的中间数据)。初始化的局部变量,通常程序中都会对用到的缓冲内存重新赋值。
 楼主| functions 发表于 2019-10-21 10:53 | 显示全部楼层
但是,对于没有初始化的局部变量需要注意“无知情的情况下被赋了值”。下边的子函数中定义了变量,但是并未初始化。按照标准C语言的准则,未初始化的变量的初值默认是0,但是KEIL对未初始化的局部变量的处理不是这样的。
  1. void function()
  2. {
  3. unsigned char k,j;
  4. if(k<j) ;
  5. else{
  6. }
  7.     }

评论

所有函数的局部变量放在一个公共存储块里,相当于一个union。  发表于 2019-10-22 02:37
 楼主| functions 发表于 2019-10-21 10:54 | 显示全部楼层
实际的编译后的反汇编程序看不到对这些局部变量的初始化。这些局部变量可能会占据那些还未被使用的内存或者其他子函数中局部变量已经释放的空间(但是这些空间可能并没有清零)。倘若是后者,其他函数局部变量释放的空间由于并没有清零,所以这些局部变量就一开始被赋了不能预先知道的值,这是不希望看到的。所以如果使用一个局部变量,就给这个变量赋个初值。
 楼主| functions 发表于 2019-10-21 10:54 | 显示全部楼层
(3)谨防程序在“无知情的情况下被优化”。如下函数的内容经过keil的编译后,就变成了“REI”。也就是说function的内容全被忽略掉。解释:keil对程序进行了优化,由于function的内容并没有任何作用,所以优化时就把这些内容忽略掉。倘若在变量前边加上volatile”,这部分内容就不会被忽略。
  1. void function()
  2. {
  3. unsigned char i,j,k;
  4. i=j+k;
  5. }
您需要登录后才可以回帖 登录 | 注册

本版积分规则

39

主题

446

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部