C51 启动文件--STARTUp.A51--详细注释
2009-12-04 16:51:35| 分类: 引用 | 标签: |字号大中小 订阅
搜狐博客 > Amala_Inter > 日志 > C51 和 A51 学习
http://amalainter.blog.sohu.com/3908879.html
2006-06-03 | C51 启动文件详细注释----绝对的原创,详细的不能再详细
了
;使编译器不使能预定义的 8051 符号,避免产生重复定义的错误。
BL51 , STARTUP.OBJ
BL51 是 Keil 使用的链接器(Linker),这是命令行的使用格式,一般不用,使用 IDE 环境,用 project 管理,有相应的按钮
A51 STARTUP.A51
$NOMOD51
;------------------------------------------------------------------------------
; This file is part of the C51 Compiler package
; Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc.
;------------------------------------------------------------------------------
; STARTUP.A51: This code is executed after processor reset.
;
; To translate this file use A51 with the following invocation:
;
;
;
; To link the modified STARTUP.OBJ file to your application use the following
; BL51 invocation:
;
;
;
可以实现该功能.
;------------------------------------------------------------------------------
;
; User-defined Power-On Initialization of Memory --- 初始化 RAM 单元
;
; With the following EQU statements the initialization of memory
; at processor reset can be defined:
;
;
IDATALEN
;
XDATASTART
; the absolute start-address of IDATA memory is always 0
EQU
0H
和连接自己修改
XDATALEN
EQU
0H
; the length of XDATA memory in bytes.
EQU
80H
; the length of IDATA memory in bytes.---根据你选用的芯片可以适当的修改这些值
; the absolute start-address of XDATA memory--以下两项根据目标系统的外设配置
0H
0H
EQU
EQU
; the length of PDATA memory in bytes.
; the absolute start-address of PDATA memory
;
PDATASTART
PDATALEN
;
; Notes: The IDATA space overlaps physically the DATA and BIT areas of the
;
;
;------------------------------------------------------------------------------
;
; Reentrant Stack Initilization --注意的再入堆栈的方向区别的芯片自带的堆栈的生长方式,自顶向下生长的!而 SP
8051 CPU. At minimum the memory space occupied from the C51
run-time routines must be set to zero.
是是自底向上的!
EQU
EQU
0
EQU
EQU
0
EQU
EQU
0
functions and initialized it:
; set to 1 if large reentrant is used.
; set to 1 if small reentrant is used.
0FFH+1 ; set top of stack to highest location+1.
0FFFFH+1; set top of stack to highest location+1.
--且再入堆栈是由编译器自己管理的,一般不必去关心,只是在有再入函数的时候,根据函数的存储器模式使用相应
;
的 RAM 空间做为再入堆栈。
; The following EQU statements define the stack pointer for reentrant
;
;Keil C 默认情况不是用堆栈来传递参数的,所以造成函数不可重入,Keil 要求用户显示声明函数是否具有可重入属性,
以便为 C 函数调用初始化栈。
; Stack Space for reentrant functions in the SMALL model.
IBPSTACK
IBPSTACKTOP
;
; Stack Space for reentrant functions in the LARGE model.
XBPSTACK
XBPSTACKTOP
;
; Stack Space for reentrant functions in the COMPACT model.
PBPSTACK
PBPSTACKTOP
;不同内存模式下的堆栈。Keil 编译器中有三种模式设置:
;Small:所有的变量都放在内部 RAM 区
;Compact:所有变量在默认情况下都会放在外部 RAM 的低 256 字节中(可由 R0 寻址)
;Large:所有变量都放在外部 RAM 中(DPTR 寻址)
;这是由 51 处理器繁多的寻址模式导致的,不同的寻址模式有不同的效率
;
;------------------------------------------------------------------------------
;
; Page Definition for Using the Compact Model with 64 KByte xdata RAM
;
; The following EQU statements define the xdata page used for pdata
; variables. The EQU PPAGE must conform with the PPAGE control used
;
;
PPAGEENABLE
;
0FFFFH+1; set top of stack to highest location+1.
; set to 1 if compact reentrant is used.
; set to 1 if pdata object are used.
in the linker invocation.
EQU
0
EQU
0
DATA 0A0H ; SFR that supplies uppermost address byte
; define PPAGE number.
PPAGE
;
PPAGE_SFR
;
外部页面 RAM 的情况
; 对 PPAGEENABLE 设置为 1 ,根据硬件连接修改 PPAGE 的值。
;------------------------------------------------------------------------------
(most 8051 variants use P2 as uppermost address byte) 很多的外部页面寻址以 P2 口为高位地址的数值,有使用
;关键字 DATA A51 伪指令定义单片机内部数据存储器字节地址的符号
DATA 0E0H
; Standard SFR Symbols
ACC
B
SP
DPL
DPH
DATA 0F0H
DATA 81H
DATA 82H
DATA 83H
NAME ?C_STARTUP ;定义当前程序模块的目标模块名
?C_C51STARTUP SEGMENT CODE
段符号名在 BL51/L51 连接定位时用
?STACK
SEGMENT IDATA
;定义一个可再定位的段符号名和段所在的存储空间,汇编器产生的这个
;定义一个 IDATA 段,段名?STACK ,符合 C51 编译器的命名规则
RSEG ?STACK
DS
1
;声明当前段是 IDATA 段,段中保留空间。
EXTRN CODE (?C_START)
;声明本模块引用的外部全局符号,用于和 C 相连接在.src 文件中可以看到这
PUBLIC ?C_STARTUP
;声明可被其他模块使用的全局符号,由.src 文件中可以看出这个符号的作用。
CSEG AT
0
;结束当前的 IDATA 段,产生一个位于 CODE 中新段,起始地址是 0000H。代码段的
个符号
起始点
?C_STARTUP:
LJMP STARTUP1
;C 编译器编译源程序后,芯片复位之后的复位代码第一个就是执行这条语
句。
RSEG ?C_C51STARTUP ;选择段名为?C_C51STARTUP 的 CODE 段为当前段,存储程序代码。
STARTUP1:
IF IDATALEN <> 0
;条件汇编指令,有 IDATA 区的话,清 IDATA 区。
MOV
CLR
IDATALOOP:
R0,#IDATALEN - 1
A
MOV @R0,A
DJNZ R0,IDATALOOP
ENDIF
IF XDATALEN <> 0
XDATALEN 的区域清零
;如果有外部数据区,则把外部数据区中从 XDATASTART 到 XDATASTART+
MOV
MOV
DPTR,#XDATASTART
R7,#LOW (XDATALEN)
IF (LOW (XDATALEN)) <> 0
MOV
R6,#(HIGH (XDATALEN)) +1 ;如果低地址是零,一个高地址就代表 256 字节
ELSE
ENDIF
MOV
R6,#HIGH (XDATALEN)
A
MOVX @DPTR,A
DPTR
CLR
XDATALOOP:
INC
DJNZ R7,XDATALOOP
DJNZ R6,XDATALOOP
ENDIF
IF PPAGEENABLE <> 0
;清外部页 RAM 区域
MOV
PPAGE_SFR,#PPAGE ;给 P2 口赋相应的值,根据用户自己的目标系统。
ENDIF
IF PDATALEN <> 0
;清外部页 RAM 区域
MOV
MOV
CLR
PDATALOOP:
INC
DJNZ R7,PDATALOOP
R0,#LOW (PDATASTART)
R7,#LOW (PDATALEN)
A
MOVX @R0,A
R0
ENDIF
IF IBPSTACK <> 0
;使用再入堆栈的情况,用户自己在程序中定义函数的存储模式。
; C51 定义了三个全局变量,?C_IBP,?C_XBP,?C_PBP 来存储再入堆栈的栈顶地址
EXTRN DATA (?C_IBP)
本身则代表的是一个 RAM 单元的地址址
; 声明本模块使用的外部全局符号,符号的段类型限制了符号的使用范围,而符号
MOV
?C_IBP,#LOW IBPSTACKTOP
ENDIF
IF XBPSTACK <> 0
EXTRN DATA (?C_XBP)
;函数是 Large 存储模式的时候,存储再入堆栈的区域。
;
MOV
MOV
?C_XBP,#HIGH XBPSTACKTOP
?C_XBP+1,#LOW XBPSTACKTOP
ENDIF
IF PBPSTACK <> 0
EXTRN DATA (?C_PBP)
;函数是 Compact 模式的时候,存储再入堆栈栈顶地址的存储单元和栈的利用空间
;
MOV
?C_PBP,#LOW PBPSTACKTOP
ENDIF
MOV
SP,#?STACK-1 ;定义的硬件栈的常数。区别再入堆栈和硬件栈。定义的段符号代表该段的首地址
; This code is required if you use L51_BANK.A51 with Banking Mode 4
; EXTRN CODE (?B_SWITCH0)
?B_SWITCH0
;
; init bank mechanism to code bank 0
CALL
LJMP ?C_START
;把执行的权力交给 C 主函数。
END