单片机成长之路(51基础篇) - 018 keil51的STARTUP.A51

STARTUP.A51原始文件:

  1 $NOMOD51;Ax51宏汇编器控制命令,禁止预定义的8051。使编译器不使能预定义的;8051符号,避免产生重复定义的错误。
  2 ;------------------------------------------------------------------------------
  3 ;  This file is part of the C51 Compiler package
  4 ;  Copyright (c) 1988-2005 Keil Elektronik GmbH and Keil Software, Inc.
  5 ;  Version 8.01
  6 ;
  7 ;  *** <<< Use Configuration Wizard in Context Menu >>> ***
  8 ;------------------------------------------------------------------------------
  9 ;  STARTUP.A51:  This code is executed after processor reset.
 10 ;
 11 ;  To translate this file use A51 with the following invocation:
 12 ;
 13 ;     A51 STARTUP.A51
 14 ;
 15 ;  To link the modified STARTUP.OBJ file to your application use the following
 16 ;  Lx51 invocation:
 17 ;
 18 ;     Lx51 your object file list, STARTUP.OBJ  controls
 19 ;
 20 ;------------------------------------------------------------------------------
 21 ;
 22 ;  User-defined <h> Power-On Initialization of Memory
 23 ;
 24 ;  With the following EQU statements the initialization of memory
 25 ;  at processor reset can be defined:
 26 ;
 27 ; <o> IDATALEN: IDATA memory size <0x0-0x100>
 28 ;     <i> Note: The absolute start-address of IDATA memory is always 0
 29 ;     <i>       The IDATA space overlaps physically the DATA and BIT areas.
 30 IDATALEN        EQU     80H
 31 ;
 32 ; <o> XDATASTART: XDATA memory start address <0x0-0xFFFF> 
 33 ;     <i> The absolute start address of XDATA memory
 34 XDATASTART      EQU     0     
 35 ;
 36 ; <o> XDATALEN: XDATA memory size <0x0-0xFFFF> 
 37 ;     <i> The length of XDATA memory in bytes.
 38 XDATALEN        EQU     0      
 39 ;
 40 ; <o> PDATASTART: PDATA memory start address <0x0-0xFFFF> 
 41 ;     <i> The absolute start address of PDATA memory
 42 PDATASTART      EQU     0H
 43 ;
 44 ; <o> PDATALEN: PDATA memory size <0x0-0xFF> 
 45 ;     <i> The length of PDATA memory in bytes.
 46 PDATALEN        EQU     0H
 47 ;
 48 ;</h>
 49 ;------------------------------------------------------------------------------
 50 ;
 51 ;<h> Reentrant Stack Initialization
 52 ;
 53 ;  The following EQU statements define the stack pointer for reentrant
 54 ;  functions and initialized it:
 55 ;
 56 ; <h> Stack Space for reentrant functions in the SMALL model.
 57 ;  <q> IBPSTACK: Enable SMALL model reentrant stack
 58 ;     <i> Stack space for reentrant functions in the SMALL model.
 59 IBPSTACK        EQU     0       ; set to 1 if small reentrant is used.
 60 ;  <o> IBPSTACKTOP: End address of SMALL model stack <0x0-0xFF>
 61 ;     <i> Set the top of the stack to the highest location.
 62 IBPSTACKTOP     EQU     0xFF +1     ; default 0FFH+1  
 63 ; </h>
 64 ;
 65 ; <h> Stack Space for reentrant functions in the LARGE model.      
 66 ;  <q> XBPSTACK: Enable LARGE model reentrant stack
 67 ;     <i> Stack space for reentrant functions in the LARGE model.
 68 XBPSTACK        EQU     0       ; set to 1 if large reentrant is used.
 69 ;  <o> XBPSTACKTOP: End address of LARGE model stack <0x0-0xFFFF>
 70 ;     <i> Set the top of the stack to the highest location.
 71 XBPSTACKTOP     EQU     0xFFFF +1   ; default 0FFFFH+1 
 72 ; </h>
 73 ;
 74 ; <h> Stack Space for reentrant functions in the COMPACT model.    
 75 ;  <q> PBPSTACK: Enable COMPACT model reentrant stack
 76 ;     <i> Stack space for reentrant functions in the COMPACT model.
 77 PBPSTACK        EQU     0       ; set to 1 if compact reentrant is used.
 78 ;
 79 ;   <o> PBPSTACKTOP: End address of COMPACT model stack <0x0-0xFFFF>
 80 ;     <i> Set the top of the stack to the highest location.
 81 PBPSTACKTOP     EQU     0xFF +1     ; default 0FFH+1  
 82 ; </h>
 83 ;</h>
 84 ;------------------------------------------------------------------------------
 85 ;
 86 ;  Memory Page for Using the Compact Model with 64 KByte xdata RAM
 87 ;  <e>Compact Model Page Definition
 88 ;
 89 ;  <i>Define the XDATA page used for PDATA variables. 
 90 ;  <i>PPAGE must conform with the PPAGE set in the linker invocation.
 91 ;
 92 ; Enable pdata memory page initalization
 93 PPAGEENABLE     EQU     0       ; set to 1 if pdata object are used.
 94 ;
 95 ; <o> PPAGE number <0x0-0xFF> 
 96 ; <i> uppermost 256-byte address of the page used for PDATA variables.
 97 PPAGE           EQU     0
 98 ;
 99 ; <o> SFR address which supplies uppermost address byte <0x0-0xFF> 
100 ; <i> most 8051 variants use P2 as uppermost address byte
101 PPAGE_SFR       DATA    0A0H
102 ;
103 ; </e>
104 ;------------------------------------------------------------------------------
105 
106 ; Standard SFR Symbols 
107 ACC     DATA    0E0H
108 B       DATA    0F0H
109 SP      DATA    81H
110 DPL     DATA    82H
111 DPH     DATA    83H
112 
113                 NAME    ?C_STARTUP
114 
115 
116 ?C_C51STARTUP   SEGMENT   CODE
117 ?STACK          SEGMENT   IDATA
118 
119                 RSEG    ?STACK
120                 DS      1
121 
122                 EXTRN CODE (?C_START)
123                 PUBLIC  ?C_STARTUP
124 
125                 CSEG    AT      0
126                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        ?C_STARTUP:     LJMP    STARTUP1
127 
128                 RSEG    ?C_C51STARTUP
129 
130 STARTUP1:
131 
132 IF IDATALEN <> 0
133                 MOV     R0,#IDATALEN - 1
134                 CLR     A
135 IDATALOOP:      MOV     @R0,A
136                 DJNZ    R0,IDATALOOP
137 ENDIF
138 
139 IF XDATALEN <> 0
140                 MOV     DPTR,#XDATASTART
141                 MOV     R7,#LOW (XDATALEN)
142   IF (LOW (XDATALEN)) <> 0
143                 MOV     R6,#(HIGH (XDATALEN)) +1
144   ELSE
145                 MOV     R6,#HIGH (XDATALEN)
146   ENDIF
147                 CLR     A
148 XDATALOOP:      MOVX    @DPTR,A
149                 INC     DPTR
150                 DJNZ    R7,XDATALOOP
151                 DJNZ    R6,XDATALOOP
152 ENDIF
153 
154 IF PPAGEENABLE <> 0
155                 MOV     PPAGE_SFR,#PPAGE
156 ENDIF
157 
158 IF PDATALEN <> 0
159                 MOV     R0,#LOW (PDATASTART)
160                 MOV     R7,#LOW (PDATALEN)
161                 CLR     A
162 PDATALOOP:      MOVX    @R0,A
163                 INC     R0
164                 DJNZ    R7,PDATALOOP
165 ENDIF
166 
167 IF IBPSTACK <> 0
168 EXTRN DATA (?C_IBP)
169 
170                 MOV     ?C_IBP,#LOW IBPSTACKTOP
171 ENDIF
172 
173 IF XBPSTACK <> 0
174 EXTRN DATA (?C_XBP)
175 
176                 MOV     ?C_XBP,#HIGH XBPSTACKTOP
177                 MOV     ?C_XBP+1,#LOW XBPSTACKTOP
178 ENDIF
179 
180 IF PBPSTACK <> 0
181 EXTRN DATA (?C_PBP)
182                 MOV     ?C_PBP,#LOW PBPSTACKTOP
183 ENDIF
184 
185                 MOV     SP,#?STACK-1
186 
187 ; This code is required if you use L51_BANK.A51 with Banking Mode 4
188 ;<h> Code Banking
189 ; <q> Select Bank 0 for L51_BANK.A51 Mode 4
190 #if 0   
191 ;     <i> Initialize bank mechanism to code bank 0 when using L51_BANK.A51 with Banking Mode 4.
192 EXTRN CODE (?B_SWITCH0)
193                 CALL    ?B_SWITCH0      ; init bank mechanism to code bank 0
194 #endif
195 ;</h>
196                 LJMP    ?C_START
197 
198                 END

 翻译后的STARTUP.A51:

  1 $NOMOD51;Ax51宏汇编器控制命令,禁止预定义的8051。使编译器不使能预定义的;8051符号,避免产生重复定义的错误。
  2 ;------------------------------------------------------------------------------
  3 ;  该文件是C51编译器包的一部分
  4 ;  版权所有(c)1988-2005 Keil Elektronik GmbH 和 Keil Software, Inc.
  5 ;  版本 8.01
  6 ;
  7 ;  *** <<< 在上下文菜单中使用配置向导 >>> ***
  8 ;------------------------------------------------------------------------------
  9 ;  STARTUP.A51:此代码在处理器复位后执行。
 10 ;
 11 ;  要编译此文件,请调用A51使用以下配置:
 12 ;
 13 ;     A51 STARTUP.A51
 14 ;
 15 ;  要将修改后的STARTUP.OBJ文件链接到您的应用程序,请使用以下命令
 16 ;  Lx51 invocation:
 17 ;
 18 ;     Lx51您的目标文件列表,STARTUP.OBJ控件
 19 ;
 20 ;------------------------------------------------------------------------------
 21 ;
 22 ;  用户定义的头文件(.h) 内存的上电初始化
 23 ;
 24 ;  用以下EQU语句初始化内存
 25 ;  在处理器重置时可以定义:
 26 ;
 27 ; <o> IDATALEN: IDATA内存大小<0x0-0x100>
 28 ;     <i> 注意: IDATA存储器的绝对起始地址始终为0
 29 ;     <i>       IDATA空间在物理上与DATA和BIT区域重叠。
 30 IDATALEN        EQU     80H
 31 ;
 32 ; <o> XDATASTART: XDATA存储器起始地址<0x0-0xFFFF>
 33 ;     <i> XDATA 存储器的绝对起始地址(不一定为0)
 34 XDATASTART      EQU     0 ;XDATA 起始位置    
 35 ;
 36 ; <o> XDATALEN: XDATA 内存大小 <0x0-0xFFFF> 
 37 ;     <i> XDATA 内存的长度,以字节为单位。
 38 XDATALEN        EQU     0 ; XDATA 结束位置(不设置XDATA)   
 39 ;
 40 ; <o> PDATASTART: PDATA 存储器起始地址<0x0-0xFFFF>
 41 ;     <i> PDATA 存储器的绝对起始地址
 42 PDATASTART      EQU     0H    ;PDATA 设置起始地址
 43 ;
 44 ; <o> PDATALEN: PDATA 内存大小 <0x0-0xFF> 
 45 ;     <i> PDATA 内存的长度,以字节为单位。
 46 PDATALEN        EQU     0H     ;设置PDATA结束为止(不设置 PDATA) 
 47 ;
 48 ;</h>
 49 ;------------------------------------------------------------------------------
 50 ;
 51 ;<h> 可重入堆栈初始化
 52 ;
 53 ;  以下EQU语句定义了可重入函数的堆栈指针并对其进行了初始化:
 54 ;  
 55 ;
 56 ; <h> 用于SMALL模型中的可重入函数的堆栈空间。
 57 ;  <q> IBPSTACK: 启用SMALL模型可重入堆栈
 58 ;     <i> 在SMALL模型中为可重入函数堆栈空间。
 59 IBPSTACK        EQU     0       ; 如果使用小重载,则设置为1。
 60 ;  <o> IBPSTACKTOP: SMALL模型堆栈的结束地址 <0x0-0xFF>
 61 ;     <i> 将堆栈顶部设置为最高位置.
 62 IBPSTACKTOP     EQU     0xFF +1     ; 默认 0FFH+1  
 63 ; </h>
 64 ;
 65 ; <h> 堆栈空间用于LARGE模型中的可重入函数.      
 66 ;  <q> XBPSTACK: 启用LARGE模型可重入堆栈
 67 ;     <i> Stack 在LARGE模型中为可重入函数堆栈空间.
 68 XBPSTACK        EQU     0       ; 如果使用大的重入,则设置为1。
 69 ;  <o> XBPSTACKTOP: LARGE模型堆栈的结束地址 <0x0-0xFFFF>
 70 ;     <i> 将堆栈顶部设置为最高位置.
 71 XBPSTACKTOP     EQU     0xFFFF +1   ; 默认 0FFFFH+1 
 72 ; </h>
 73 ;
 74 ; <h> 用于COMPACT模型中的重入函数的堆栈空间.    
 75 ;  <q> PBPSTACK: 启用COMPACT模型可重入堆栈
 76 ;     <i> COMPACT模型中可重入函数的空间.
 77 PBPSTACK        EQU     0       ; 如果使用紧凑重入,则设置为1.
 78 ;
 79 ;   <o> PBPSTACKTOP: COMPACT模型堆栈的结束地址 <0x0-0xFFFF>
 80 ;     <i> 将堆栈顶部设置为最高位置.
 81 PBPSTACKTOP     EQU     0xFF +1     ; 默认 0FFH+1  
 82 ; </h>
 83 ;</h>
 84 ;------------------------------------------------------------------------------
 85 ;
 86 ;  使用64 KB xteata RAM的紧凑型号的内存页面
 87 ;  <e>紧凑型模型页面定义
 88 ;
 89 ;  <i>定义用于PDATA变量的XDATA页面. 
 90 ;  <i>PAGE必须符合链接器调用中设置的PAGE.
 91 ;
 92 ; 启用数据存储页面初始化
 93 PPAGEENABLE     EQU     0       ; 如果使用pdata对象,则设置为1.
 94 ;
 95 ; <o> 页码 <0x0-0xFF> 
 96 ; <i> 用于PDATA变量的页面的最高256字节地址.
 97 PPAGE           EQU     0
 98 ;
 99 ; <o> 提供最高地址字节的SFR地址 <0x0-0xFF> 
100 ; <i> 大多数8051变体使用P2作为最高地址字节
101 PPAGE_SFR       DATA    0A0H
102 ;
103 ; </e>
104 ;------------------------------------------------------------------------------
105 
106 ; 标准SFR(特殊功能寄存器)符号(寄存器定义声称别名)(sfr特殊功能寄存器 sfr也是一种扩充数据类型,点用一个内存单元,值域为0~255。利用它可以访问51单片机内部的所有特殊功能寄存器。)
107 ACC     DATA    0E0H;累加器
108 B       DATA    0F0H;通用寄存器
109 SP      DATA    81H;堆栈指针
110 DPL     DATA    82H;数据指针低8位
111 DPH     DATA    83H;数据指针高8位
112 
113                 NAME    ?C_STARTUP;定义一个模块名: ?C_STARTUP
114 
115 
116 ?C_C51STARTUP   SEGMENT   CODE;声明(ROM)代码段
117 ?STACK          SEGMENT   IDATA;声明(RAM)堆栈
118 
119                 RSEG    ?STACK;RSEG选择一个先前声明的可重定位段
120                 DS      1;位堆栈预留一个低阶的储存空间
121 
122                 EXTRN CODE (?C_START);当前文件的代码储存区
123                 PUBLIC  ?C_STARTUP;声明可以用于其他目标模块的全局符号?C_STARTUP,用于和 C 链接在.src文件中可以看到这个符号
124 
125                 CSEG    AT      0;选择代码存储区的一个绝对段,汇编从上面命令中的地址0开始执行这个段。
126                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        ?C_STARTUP:     LJMP    STARTUP1
127 
128                 RSEG    ?C_C51STARTUP;选择代码段?C_C51STARTUP
129 
130 STARTUP1:        ;代码块STARTUP1
131 
132 IF IDATALEN <> 0;如果IDATALEN不为零,则将长度减1送R0
133                 MOV     R0,#IDATALEN - 1    ;将长度-1送R0
134                 CLR     A                ;清零累加器
135 IDATALOOP:      MOV     @R0,A            ;初始化IDATA
136                 DJNZ    R0,IDATALOOP    ;(DJNZ)R0减1后不为0则转移(跳转)IDATALOOP
137 ENDIF
138 
139 IF XDATALEN <> 0;如果有外部数据储存区 XDATALEN为外部空间的长度
140                 MOV     DPTR,#XDATASTART;起始地址送DPTR
141                 MOV     R7,#LOW (XDATALEN);长度的低8位送到R7
142   IF (LOW (XDATALEN)) <> 0    ;长度的低8位不为零继续
143                 MOV     R6,#(HIGH (XDATALEN)) +1;高8位+1送R6,下面清0用
144   ELSE                        ;长度的低8位为零继续
145                 MOV     R6,#HIGH (XDATALEN);高8位直接送R6,下面清0用
146   ENDIF
147                 CLR     A    ;清零累加器
148 XDATALOOP:      MOVX    @DPTR,A;XDATA环节 送A(清零累加器)的数据到单片机外部(ROM)(DPTR是16位地址位)
149                 INC     DPTR;数据指针加 1
150                 DJNZ    R7,XDATALOOP;R7减1后不为0则转移XDATALOOP
151                 DJNZ    R6,XDATALOOP;R6减1后不为0则转移XDATALOOP
152 ENDIF
153 
154 IF PPAGEENABLE <> 0;外部ram页面地址使能,(pdata     --->   分页寻址片外ram (MOVX @R0)) 
155                 MOV     PPAGE_SFR,#PPAGE;上面一条成立,PPAGE_SFR设置为大多数8051变体使用P2作为最高地址字节,如果不成立,说明没有使用
156 ENDIF
157 
158 IF PDATALEN <> 0;判断外部PDATA的长度是否为0(有没有配置外部RAM),如果不为零(使用了外部RAM),则进行下面的操作。
159                 MOV     R0,#LOW (PDATASTART);获取外部的RAM(PDATA)起始地址的低8位
160                 MOV     R7,#LOW (PDATALEN);获取外部的RAM(PDATA)长度的低8位
161                 CLR     A;清零累加器
162 PDATALOOP:      MOVX    @R0,A;PDATA环节,送A(清零累加器)的数据到单片机外部(RAM)(@R0是8位地址位)
163                 INC     R0;数据指针加 1
164                 DJNZ    R7,PDATALOOP;R7减1后不为0则转移PDATALOOP
165 ENDIF
166 
167 IF IBPSTACK <> 0;可重载的模拟栈设置:http://www.21ic.com/jichuzhishi/mcu/questions/2018-05-02/759519.html
168 EXTRN DATA (?C_IBP);使用其他目标模块中定义的?C_IBP(模拟栈指针)(.M51文件中)
169 
170                 MOV     ?C_IBP,#LOW IBPSTACKTOP;模拟栈指针指向栈顶
171 ENDIF
172 
173 IF XBPSTACK <> 0 ;Large模式下使能模拟栈
174 EXTRN DATA (?C_XBP)
175                  ;栈指针指向栈顶
176                 MOV     ?C_XBP,#HIGH XBPSTACKTOP
177                 MOV     ?C_XBP+1,#LOW XBPSTACKTOP
178 ENDIF
179 
180 IF PBPSTACK <> 0 ;COMPACT模式下的模拟栈
181 EXTRN DATA (?C_PBP)
182                 MOV     ?C_PBP,#LOW PBPSTACKTOP;指向栈顶
183 ENDIF
184 
185                 MOV     SP,#?STACK-1;硬件栈SP赋值
186 
187 ; 如果您将L51_BANK.A51与Banking Mode 4一起使用,则需要此代码
188 ;<h> 代码银行
189 ; <q> 为L51_BANK.A51模式4选择Bank 0
190 #if 0   
191 ;     <i> 在银行模式4下使用L51_BANK.A51时,将银行机制初始化为代码库0.
192 EXTRN CODE (?B_SWITCH0)
193                 CALL    ?B_SWITCH0      ; 代码银行0的初始银行机制
194 #endif
195 ;</h>
196                 LJMP    ?C_START ;执行main函数
197 
198                 END

 

posted @ 2019-01-26 16:03  极客先锋  阅读(2427)  评论(0编辑  收藏  举报