KeilC51生成的hex文件为何要将这些空间全部写0?

2020-02-04 09:32发布

RT。。

看到hex文件反汇编回来时的最开始都会有这样一些代码:

LJMP  @@

@@:
mov R0,#0x7f     ;(R0)=0x7f
clr A            ;(A)=0
@:
mov @R0,A      ;     ((R0))=0
djnz R0,@      ;      (R0)--     if((R0)!=0)  goto @;


编译器这样做的目的是什么了?请哪位前辈指教下!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
7条回答
Alimy
2020-02-04 14:24
个人猜想:
清零00~7f的内部数据存储器。。备用变量空间和堆栈空间。。keil的编译器会默认把局部变量赋值为0,不会出现未知的值、、


/*测试程序*/

#include "reg52.h"

void test()
{
        int j;
        P1=j|0x3f;
}
void main()
{
        int i;
        P0=0x01;
        P0=i;
        test();
        return;
}


反汇编的结果,局部变量虽然没有赋给初值。但都默认为0了。。
Q0000:        LJMP  Q0003                        ;0000   02 00 03
Q0003:        MOV   R0,#7FH                      ;0003   78 7F
              CLR   A                            ;0005   E4
_loops:       MOV   @R0,A                        ;0006   F6
              DJNZ  R0,_loops                    ;0007   D8 FD   初始化内部RAM空间
              MOV   SP,#0BH                      ;0009   75 81 0B  设置栈顶
              LJMP  _main                        ;000C   02 00 0F
_main:        MOV   P0,#01H                      ;000F   75 80 01
              MOV   P0,09H                       ;0012   85 09 80
              LCALL _test                        ;0015   12 00 19
              RET                                ;0018   22
_test:        MOV   A,0BH                        ;0019   E5 0B
              ORL   A,#3FH                       ;001B   44 3F
              MOV   P1,A                         ;001D   F5 90
              RET                                ;001F   22

所以Keil编译出来的代码会默认把未手动初始化的变量赋值为0。。


修改原因:图片无法正常显示,重新编辑。。

一周热门 更多>