单片机成长之路(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

原文地址:https://www.cnblogs.com/jikexianfeng/p/10323706.html

时间: 2024-08-28 22:59:20

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

单片机成长之路(51基础篇) - 009 关于sdcc的多文件编译范例

本范例主要由(main.c ,delay.h,delay.c,makefile)4个文件组成,sdcc的编译环境搭建参照:单片机成长之路(51基础篇) - 006 在Linux下搭建51单片机的开发烧写环境,废话不多,进入主题: main.c(主函数) 1 #include "8051.h" 2 #include "delay.h" 3 #define uint unsigned int 4 #define uchar unsigned char 5 uchar t

python成长之路第三篇(1)_初识函数

目录: 函数 1.为什么要使用函数 2.什么是函数 3.函数的返回值 4.文档化函数 5.函数传参数 文件操作(二) 1.文件操作的步骤 2.文件的内置方法 函数: 一.为什么要使用函数 在日常写代码中,我们会发现有很多代码是重复利用的,这样会使我们的代码变得异常臃肿,比如说: 我们要写一个验证码的功能 例子: 比如说我们要进行一些操作,而这些操作需要填写验证码 验证码代码:  1 import random   2 number_check = ''   3 for i in range(0,

Sass进阶之路,之一(基础篇)

Sass 学习Sass之前,应该要知道css预处理器这个东西,css预处理器是什么呢? Css预处理器定义了一种新的语言将Css作为目标生成文件,然后开发者就只要使用这种语言进行编码工作了.预处理器通常可以实现浏览器兼容,变量,结构体等功能,代码更加简洁易于维护. 那么css预处理器与Sass有什么关系呢,Sass就是属于css预处理器中的一种,还有两款他们分别是Less和 Stylus,这里就不做过多的介绍了. 什么是Sass sass是一种css的开发工具,提供了很多便利的写法,不但使css

单片机成长之路(51基础篇) - 022 N76e003 APROM模拟EEPROM驱动

N76e003单片机内部没有EEPROM,但是可以使用 APROM模拟EEPROM功能,代码如下: eeprom.h 1 #ifndef _EEPROM_H_ 2 #define _EEPROM_H_ 3 4 //EEPROM 指令 5 #define BYTE_PROGRAM_AP 0x21 //APROM 字节编程(数据写入) 6 #define PAGE_ERASE_AP 0x22 //APROM 页擦除 (128字节) 7 #define BYTE_Read_AP 0x00 //APRO

单片机成长之路(51基础篇) - 016 常见总线类型

1.首先看看它名字真正的含义: SPI(Serial Peripheral Interface:串行外设接口); I2C(INTER IC BUS:意为IC之间总线) UART(Universal Asynchronous Receiver Transmitter:通用异步收发器) USART:通用同步异步收发器 USB:Universal Serial BUS(通用串行总线) CAN:现场总线 2.看看他们传输数据线的组成: SPI总线由三条信号线组成:串行时钟(SCLK).串行数据输出(SD

单片机成长之路(51基础篇) - 023 N76e003 系统时钟切换到外部时钟

N76e003切换到外部时钟的资料很少(因为N76e003的片子是不支持无源晶振的,有源晶振的成本又很高,所以网上很少有对N76e003的介绍).有图有真相: 代码如下: main.c 1 #include <N76E003.H> 2 #include <SFR_Macro.h> 3 #include <Function_Define.h> 4 5 bit BIT_TMP; // 调用 SFR_Macro.h 使用的 6 7 void main(void){ 8 //

单片机成长之路(avr基础篇)- 003 AVR单片机的BOOT区

BOOT区的由来基于一个简单的道理,即单片机的程序是保存在FLASH中的,要运行程序就必须不停的访问FLASH存储器.对于一般的FLASH存储器,数据的写入需要一定的时间来完成,在数据写入完成之前,存储器中所有的数据都是不可读的,这就在运行旧程序和写入新程序之间造成了一个矛盾. 使用BOOT区是解决这个矛盾的方法之一,它将FLASH存储器从物理上分为两个独立的区域,对其中的一个区的数据写入不会影响到另一个区的数据读取操作.我们可以让单片机的程序在其中一个区(通常是BOOT区)运行,而运行着的程序

Python成长之路【第二篇】Python基础之数据类型

阅读目录 简介 1 什么是数据? x=10,10是我们要存储的数据 2 为何数据要分不同的类型 数据是用来表示状态的,不同的状态就应该用不同的类型的数据去表示 3 数据类型 数字(整形,长整形,浮点型,复数) 字符串 列表 元组 字典 集合 4 如何学习 #一:基本使用 1 用途 2 定义方式 3 常用操作+内置的方法 #二:该类型总结 1 存一个值or存多个值 只能存一个值 可以存多个值,值都可以是什么类型 2 有序or无序 3 可变or不可变 !!!可变:值变,id不变.可变==不可hash

开篇(架构师的成长之路---第1篇)

本人java程序猿一枚,2012年参加工作.一步一步的由最初的程序员成长为独立事业部经理,迷茫过,也兴奋过.今天的我又迷茫了. 在人生的道路上,每个人都会遇到很多次选择,每一次的选择决定了今后一段时间的人生走向.今天的我又到了选择的时候. 谨以此博客,来积累技术的点滴,让文字指引我前行的方向. 谨以此博客,来记录一个普通程序猿人生过程中前行的脚步. 我是一个普通的房奴人,我的目标就是努力赚钱,减轻家庭还房贷的压力. 我是一个骑电瓶车上班的人,我的目标就是努力赚钱,希望拥有家庭的一辆小轿车. 我是