51单片机Keil里为何实际代码总是从0x800开始的?

2019-07-15 11:34发布

单片机是STC15F204EA, keil里不论勾选不勾选use onchip rom都没用。
这样造成0x7FF之前大部分是0xFF,浪费程序空间。看startup.a51也没看明白这个0x800怎么来的。。
有大神指导吗?

            CODE    0800H     006DH     INBLOCK      ?PR?TM0?MAIN




BL51 BANKED LINKER/LOCATER V6.22, INVOKED BY:
D:PROGRAM FILES (X86)KEIL5C51BINBL51.EXE .Objectsmain.obj TO .Objectsqxrh00 PRINT (.Listingsqxrh00.m51) RAMSI
>> ZE (256) CODE (0X0000-0X0FF8)


MEMORY MODEL: SMALL


INPUT MODULES INCLUDED:
  .Objectsmain.obj (MAIN)
  D:PROGRAM FILES (X86)KEIL5C51LIBC51S.LIB (?C_STARTUP)


LINK MAP OF MODULE:  .Objectsqxrh00 (MAIN)


            TYPE    BASE      LENGTH    RELOCATION   SEGMENT NAME
            -----------------------------------------------------

            * * * * * * *   D A T A   M E M O R Y   * * * * * * *
            REG     0000H     0008H     ABSOLUTE     "REG BANK 0"
            DATA    0008H     001EH     UNIT         ?DT?MAIN
            IDATA   0026H     0001H     UNIT         ?STACK

            * * * * * * *   C O D E   M E M O R Y   * * * * * * *
            CODE    0000H     0003H     ABSOLUTE     
                    0003H     0008H                  *** GAP ***
            CODE    000BH     0003H     ABSOLUTE     
                    000EH     07F2H                  *** GAP ***
            CODE    0800H     006DH     INBLOCK      ?PR?TM0?MAIN
            CODE    086DH     0049H     INBLOCK      ?PR?MAIN?MAIN
            CODE    08B6H     000FH     INBLOCK      ?PR?UART_INIT?MAIN
            CODE    08C5H     000CH     UNIT         ?C_C51STARTUP



OVERLAY MAP OF MODULE:   .Objectsqxrh00 (MAIN)


SEGMENT
  +--> CALLED SEGMENT
---------------------
?C_C51STARTUP
  +--> ?PR?MAIN?MAIN

?PR?MAIN?MAIN
  +--> ?PR?UART_INIT?MAIN

******************************************************************************
* RESTRICTED VERSION WITH 0800H BYTE CODE SIZE LIMIT; USED: 00C8H BYTE ( 9%) *
******************************************************************************

Program Size: data=39.0 xdata=0 code=215
LINK/LOCATE RUN COMPLETE.  0 WARNING(S),  0 ERROR(S)


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
14条回答
houjue
1楼-- · 2019-07-17 15:34
悠游大萝卜 发表于 2017-3-27 20:14
还是不明白,如果像下面这么写汇编,那就是从0x100开始的,也就是可以控制的,生成的hex也是对的。
但是写C的时候不知道如何控制。

其实楼上已经说的比较清楚了。汇编可以指定地址,C语言是由软件内部决定的,不用编译者操心。道理就是这么简单,明白了吗?
悠游大萝卜
2楼-- · 2019-07-17 15:55
楼上几个人真是搞笑,估计都没认真看我的提问,真正原因就是编译器需要注册,否则就给你定死在那个地址。

一周热门 更多>