單片機成長之路(51基礎篇) - 018 keil51的STARTUP.A51

STARTUP.A51原始文件:html

  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:app

  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
相關文章
相關標籤/搜索