; Memory Page for Using the Compact Model with 64 KByte xdata RAM
; <e>Compact Model Page Definition
;
; <i>Define the XDATA page used for PDATA variables.
; <i>PPAGE must conform with the PPAGE set in the linker invocation.
;
; Enable pdata memory page initalization
PPAGEENABLE EQU 0 ; set to 1 if pdata object are used.
; 如果使用分页寻址,当置1
; <o> PPAGE number <0x0-0xFF>
; <i> uppermost 256-byte address of the page used for PDATA variables.
PPAGE EQU 0
;
; <o> SFR address which supplies uppermost address byte <0x0-0xFF>
; <i> most 8051 variants use P2 as uppermost address byte
;页号,即将由P2口输出的高位地址
PPAGE_SFR DATA 0A0H
;
; </e>
;细看,0A0H,正是P2口的字节地址
;------------------------------------------------------------------------------
; Standard SFR Symbols
; 鸟语的意思似乎是,标准特寄器符号.下文要用,所以先自行定义一下
ACC DATA 0E0H
B DATA 0F0H
SP DATA 81H
DPL DATA 82H
DPH DATA 83H
NAME ?C_STARTUP ;程序模块名
?C_C51STARTUP SEGMENT CODE ;声明一个再定位CODE段
?STACK SEGMENT IDATA ;声明一个再定位IDATA段
RSEG ?STACK ;将?STACK段作为当前段
DS 1
;留一字节空间备用,后文没有对其寻址,这样做有何妙用呢?问题一
EXTRN CODE (?C_START)
;声明一个外部CODE符号,此符号当在C模块的main()中定义,本汇编程序结束后,就是跳
;至?C_START处的.是不是这样呢?求证,问题二.
PUBLIC ?C_STARTUP
;将程序标号 ?C_STARTUP声明为全局型,其它模块可以对其寻址
CSEG AT 0
;声明一个绝对CODE段,从地址0开始,这显然是复位后的程序入口
?C_STARTUP: LJMP STARTUP1
; 显然,?C_STARTUP就是常数0,为何要进行前面一些操作,我直接定义一个绝对段,然后把可
;执行指令写在其下,这不是简单易懂吗?上面的安排是何道理呢?问题三
RSEG ?C_C51STARTUP
STARTUP1:
IF IDATALEN <> 0
MOV R0,#IDATALEN - 1
CLR A
IDATALOOP: MOV @R0,A
DJNZ R0,IDATALOOP
ENDIF
;51的话,R0开始时指向7F,这样循环127次,RAM的地址0未清零,但该地址即R0
;显然是顺手清零了的,一手二牍,精妙绝伦!
IF XDATALEN <> 0
MOV DPTR,#XDATASTART
MOV R7,#LOW (XDATALEN)
IF (LOW (XDATALEN)) <> 0
MOV R6,#(HIGH (XDATALEN)) +1
ELSE
MOV R6,#HIGH (XDATALEN)
ENDIF
;这个复合语句是算法精华.预先对借位进行了处理,精妙!我是再也想不到的,佩服!
CLR A
XDATALOOP: MOVX @DPTR,A
INC DPTR
DJNZ R7,XDATALOOP
DJNZ R6,XDATALOOP
ENDIF
IF PPAGEENABLE <> 0
MOV PPAGE_SFR,#PPAGE ;向P2口输出页地址
ENDIF
IF PDATALEN <> 0
MOV R0,#LOW (PDATASTART)
MOV R7,#LOW (PDATALEN)
CLR A
PDATALOOP: MOVX @R0,A
INC R0
DJNZ R7,PDATALOOP
ENDIF
IF IBPSTACK <> 0 ;如果开通模拟栈功能,
EXTRN DATA (?C_IBP);声明一个外部DATA符号,当在C模块中定义,求证,问题4
MOV ?C_IBP,#LOW IBPSTACKTOP;;初始化栈指针
ENDIF
IF XBPSTACK <> 0
EXTRN DATA (?C_XBP)
MOV ?C_XBP,#HIGH XBPSTACKTOP
MOV ?C_XBP+1,#LOW XBPSTACKTOP
ENDIF
IF PBPSTACK <> 0
EXTRN DATA (?C_PBP)
MOV ?C_PBP,#LOW PBPSTACKTOP
ENDIF
MOV SP,#?STACK-1
;按照Keil的定位规则,堆栈段总是在最后定位,由于段名即首地址,固将其减一正好作为栈指
;针,自解问题一,留一个字节空间正是语法所需,并无积极意义,是否如此?如果工程里不加这
;个启动配置文件,堆栈指针是何处赋值呢?问题五
; This code is required if you use L51_BANK.A51 with Banking Mode 4
;<h> Code Banking
; <q> Select Bank 0 for L51_BANK.A51 Mode 4
#if 0
; <i> Initialize bank mechanism to code bank 0 when using L51_BANK.A51 with Banking
; Mode 4.
EXTRN CODE (?B_SWITCH0)
CALL ?B_SWITCH0 ; init bank mechanism to code bank 0
#endif
;</h>
;以上条件汇编完全不明所以,问题六
LJMP ?C_START
END |