[KungFu8位 MCU] keil51的STARTUP.A51解析

[复制链接]
1234|5
 楼主| merry_zsp 发表于 2019-10-31 09:50 | 显示全部楼层 |阅读模式
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. ; Standard SFR Symbols
  106. ACC     DATA    0E0H
  107. B       DATA    0F0H
  108. SP      DATA    81H
  109. DPL     DATA    82H
  110. DPH     DATA    83H

  111.                 NAME    ?C_STARTUP


  112. ?C_C51STARTUP   SEGMENT   CODE
  113. ?STACK          SEGMENT   IDATA

  114.                 RSEG    ?STACK
  115.                 DS      1

  116.                 EXTRN CODE (?C_START)
  117.                 PUBLIC  ?C_STARTUP

  118.                 CSEG    AT      0
  119.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        ?C_STARTUP:     LJMP    STARTUP1

  120.                 RSEG    ?C_C51STARTUP

  121. STARTUP1:

  122. IF IDATALEN <> 0
  123.                 MOV     R0,#IDATALEN - 1
  124.                 CLR     A
  125. IDATALOOP:      MOV     @R0,A
  126.                 DJNZ    R0,IDATALOOP
  127. ENDIF

  128. IF XDATALEN <> 0
  129.                 MOV     DPTR,#XDATASTART
  130.                 MOV     R7,#LOW (XDATALEN)
  131.   IF (LOW (XDATALEN)) <> 0
  132.                 MOV     R6,#(HIGH (XDATALEN)) +1
  133.   ELSE
  134.                 MOV     R6,#HIGH (XDATALEN)
  135.   ENDIF
  136.                 CLR     A
  137. XDATALOOP:      MOVX    @DPTR,A
  138.                 INC     DPTR
  139.                 DJNZ    R7,XDATALOOP
  140.                 DJNZ    R6,XDATALOOP
  141. ENDIF

  142. IF PPAGEENABLE <> 0
  143.                 MOV     PPAGE_SFR,#PPAGE
  144. ENDIF

  145. IF PDATALEN <> 0
  146.                 MOV     R0,#LOW (PDATASTART)
  147.                 MOV     R7,#LOW (PDATALEN)
  148.                 CLR     A
  149. PDATALOOP:      MOVX    @R0,A
  150.                 INC     R0
  151.                 DJNZ    R7,PDATALOOP
  152. ENDIF

  153. IF IBPSTACK <> 0
  154. EXTRN DATA (?C_IBP)

  155.                 MOV     ?C_IBP,#LOW IBPSTACKTOP
  156. ENDIF

  157. IF XBPSTACK <> 0
  158. EXTRN DATA (?C_XBP)

  159.                 MOV     ?C_XBP,#HIGH XBPSTACKTOP
  160.                 MOV     ?C_XBP+1,#LOW XBPSTACKTOP
  161. ENDIF

  162. IF PBPSTACK <> 0
  163. EXTRN DATA (?C_PBP)
  164.                 MOV     ?C_PBP,#LOW PBPSTACKTOP
  165. ENDIF

  166.                 MOV     SP,#?STACK-1

  167. ; This code is required if you use L51_BANK.A51 with Banking Mode 4
  168. ;<h> Code Banking
  169. ; <q> Select Bank 0 for L51_BANK.A51 Mode 4
  170. #if 0   
  171. ;     <i> Initialize bank mechanism to code bank 0 when using L51_BANK.A51 with Banking Mode 4.
  172. EXTRN CODE (?B_SWITCH0)
  173.                 CALL    ?B_SWITCH0      ; init bank mechanism to code bank 0
  174. #endif
  175. ;</h>
  176.                 LJMP    ?C_START

  177.                 END


 楼主| merry_zsp 发表于 2019-10-31 09:51 | 显示全部楼层
翻译后的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. ; 标准SFR(特殊功能寄存器)符号(寄存器定义声称别名)(sfr特殊功能寄存器 sfr也是一种扩充数据类型,点用一个内存单元,值域为0~255。利用它可以访问51单片机内部的所有特殊功能寄存器。)
  106. ACC     DATA    0E0H;累加器
  107. B       DATA    0F0H;通用寄存器
  108. SP      DATA    81H;堆栈指针
  109. DPL     DATA    82H;数据指针低8位
  110. DPH     DATA    83H;数据指针高8位

  111.                 NAME    ?C_STARTUP;定义一个模块名: ?C_STARTUP


  112. ?C_C51STARTUP   SEGMENT   CODE;声明(ROM)代码段
  113. ?STACK          SEGMENT   IDATA;声明(RAM)堆栈

  114.                 RSEG    ?STACK;RSEG选择一个先前声明的可重定位段
  115.                 DS      1;位堆栈预留一个低阶的储存空间

  116.                 EXTRN CODE (?C_START);当前文件的代码储存区
  117.                 PUBLIC  ?C_STARTUP;声明可以用于其他目标模块的全局符号?C_STARTUP,用于和 C 链接在.src文件中可以看到这个符号

  118.                 CSEG    AT      0;选择代码存储区的一个绝对段,汇编从上面命令中的地址0开始执行这个段。
  119.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        ?C_STARTUP:     LJMP    STARTUP1

  120.                 RSEG    ?C_C51STARTUP;选择代码段?C_C51STARTUP

  121. STARTUP1:        ;代码块STARTUP1

  122. IF IDATALEN <> 0;如果IDATALEN不为零,则将长度减1送R0
  123.                 MOV     R0,#IDATALEN - 1    ;将长度-1送R0
  124.                 CLR     A                ;清零累加器
  125. IDATALOOP:      MOV     @R0,A            ;初始化IDATA
  126.                 DJNZ    R0,IDATALOOP    ;(DJNZ)R0减1后不为0则转移(跳转)IDATALOOP
  127. ENDIF

  128. IF XDATALEN <> 0;如果有外部数据储存区 XDATALEN为外部空间的长度
  129.                 MOV     DPTR,#XDATASTART;起始地址送DPTR
  130.                 MOV     R7,#LOW (XDATALEN);长度的低8位送到R7
  131.   IF (LOW (XDATALEN)) <> 0    ;长度的低8位不为零继续
  132.                 MOV     R6,#(HIGH (XDATALEN)) +1;高8位+1送R6,下面清0用
  133.   ELSE                        ;长度的低8位为零继续
  134.                 MOV     R6,#HIGH (XDATALEN);高8位直接送R6,下面清0用
  135.   ENDIF
  136.                 CLR     A    ;清零累加器
  137. XDATALOOP:      MOVX    @DPTR,A;XDATA环节 送A(清零累加器)的数据到单片机外部(ROM)(DPTR是16位地址位)
  138.                 INC     DPTR;数据指针加 1
  139.                 DJNZ    R7,XDATALOOP;R7减1后不为0则转移XDATALOOP
  140.                 DJNZ    R6,XDATALOOP;R6减1后不为0则转移XDATALOOP
  141. ENDIF

  142. IF PPAGEENABLE <> 0;外部ram页面地址使能,(pdata     --->   分页寻址片外ram (MOVX @R0))
  143.                 MOV     PPAGE_SFR,#PPAGE;上面一条成立,PPAGE_SFR设置为大多数8051变体使用P2作为最高地址字节,如果不成立,说明没有使用
  144. ENDIF

  145. IF PDATALEN <> 0;判断外部PDATA的长度是否为0(有没有配置外部RAM),如果不为零(使用了外部RAM),则进行下面的操作。
  146.                 MOV     R0,#LOW (PDATASTART);获取外部的RAM(PDATA)起始地址的低8位
  147.                 MOV     R7,#LOW (PDATALEN);获取外部的RAM(PDATA)长度的低8位
  148.                 CLR     A;清零累加器
  149. PDATALOOP:      MOVX    @R0,A;PDATA环节,送A(清零累加器)的数据到单片机外部(RAM)(@R0是8位地址位)
  150.                 INC     R0;数据指针加 1
  151.                 DJNZ    R7,PDATALOOP;R7减1后不为0则转移PDATALOOP
  152. ENDIF

  153. IF IBPSTACK <> 0;可重载的模拟栈设置:http://www.21ic.com/jichuzhishi/mcu/questions/2018-05-02/759519.html
  154. EXTRN DATA (?C_IBP);使用其他目标模块中定义的?C_IBP(模拟栈指针)(.M51文件中)

  155.                 MOV     ?C_IBP,#LOW IBPSTACKTOP;模拟栈指针指向栈顶
  156. ENDIF

  157. IF XBPSTACK <> 0 ;Large模式下使能模拟栈
  158. EXTRN DATA (?C_XBP)
  159.                  ;栈指针指向栈顶
  160.                 MOV     ?C_XBP,#HIGH XBPSTACKTOP
  161.                 MOV     ?C_XBP+1,#LOW XBPSTACKTOP
  162. ENDIF

  163. IF PBPSTACK <> 0 ;COMPACT模式下的模拟栈
  164. EXTRN DATA (?C_PBP)
  165.                 MOV     ?C_PBP,#LOW PBPSTACKTOP;指向栈顶
  166. ENDIF

  167.                 MOV     SP,#?STACK-1;硬件栈SP赋值

  168. ; 如果您将L51_BANK.A51与Banking Mode 4一起使用,则需要此代码
  169. ;<h> 代码银行
  170. ; <q> 为L51_BANK.A51模式4选择Bank 0
  171. #if 0   
  172. ;     <i> 在银行模式4下使用L51_BANK.A51时,将银行机制初始化为代码库0.
  173. EXTRN CODE (?B_SWITCH0)
  174.                 CALL    ?B_SWITCH0      ; 代码银行0的初始银行机制
  175. #endif
  176. ;</h>
  177.                 LJMP    ?C_START ;执行main函数

  178.                 END
tfqi 发表于 2019-11-13 12:46 | 显示全部楼层
非常不错的资料
wiba 发表于 2019-11-13 12:55 | 显示全部楼层
非常感谢楼主分享
zljiu 发表于 2019-11-13 13:04 | 显示全部楼层
非常感谢楼主分享
coshi 发表于 2019-11-13 13:12 | 显示全部楼层
非常感谢楼主分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

75

主题

695

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部