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