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条回答
BOWEIworks
2019-07-17 10:44
0x800就是主程序所在位置,程序默认是从0x000开始的,但是0X000只是一个引导向量,再下面就是各种外设的中断入口向量了,然后才是主程序的地址存储空间,主程序结束后接下来就是子程序的地址存储空间,主程序用多少没有限制,子程序用多少也没有限制,就是不能超过ROM的大小,这样说能理解吗?

一周热门 更多>