.include "..\include\p33EP128MC506.inc"
头文件包含
.section .start_section,code
代码段的定义
.global __reset
标识符声明
接下来要写启动文件的实现功能:关闭中断,关闭看门狗、堆栈设置、数据RAM清零、跳转主程序
一、关闭中断 
将IPL<2:0>设置为111即可关闭中断,我们采用或操作,将该寄存器和00E0(即0000 0000 1110 0000)进行或操作,可改变IPL<2:0>数据,而对其它位数据进行保留。
mov SR,w0 //将SR数据送入到w0
mov #0x00e0,w1 //将0x00e0送入到w1
ior w0,w1,w0 //进行或操作
mov w0,SR //将w0中的数据送入到SR
ior表示将w0和w1的数据或操作后,结果送入到w0中。另外代码中w0,w1都表示该单片机的工作寄存器。
二、关闭看门狗
关闭看门狗,我们只需在RCON寄存器对bit5为0,即可禁止看门狗,我们对该寄存器执行与操作,使得只改变该位的数据,而不改变其它为的数据。
mov RCON,w0
mov #0xffdf,w1
and w0,w1,w0 //1111 1111 1101 1111 & w0
mov w0,RCON
三、堆栈设置
在链接描述文件中间中定义:
.stack 0x1050(NOLOAD):
{
__SP_init = .;/*-堆栈起始地址为0x1050--*/
. += 0x00a8;/*--堆栈大小为168字节---*/
__SPLIM_init = .;/*---堆栈限制上溢地址为0x10F8--*/
. += 0x0008;
} > data
在启动文件中设置:
mov #__SP_init,w15 ;堆栈的开始
mov #__SPLIM_init,w0
mov w0,SPLIM ;堆栈限制寄存器
四、数据RAM清除
将 RAM 从 0x1000 - 0x4FFFE 范围数据清 0
mov #0x1000,w0
mov #0x5000,w1
clr [w0++] //清零
xor w0,w1,w2 //异或
bra NZ,$-4 //非零跳转
[w0++]表示w0中的数据地址里的值,即一开始w0存放0x1000,接着是clr [w0++]清除0x1000地址中数据单元的值,并递增一个字即0x1002。以一个例子说明如下:
w0为何是加2,而不是加1,是因为该指令是16 位操作,只需要考虑偶数地址,每次清 2 个字节,每次把奇数地址和偶数地址都清了
下一步 xor w0,w1,w2,xor是异或指令,w0和w1数据相同则w2为0,不同为1,这条指令的目的是判断RAM清零数据有没有全部清零。值得一提的是,为什么第二条指令w1要存放0x5000而不是0x4FFE,原因是当w0加到0x4FFE时,clr指令清零0x4FFE数据单元里的值,然后加2,此时RAM空间已经全部清零,循环结束,w0变为0x5000,故要和0x5000做比较而不是0x4FFE.
bra NZ,$-4 bra为转移指令,具体用法如下:
$-4表示PC值减4,由于每执行一条指令PC值加2,所以是跳到clr [w0++] 指令。具体来说,当w0和w1不同时,即异或操作后输出为1,bra NZ 判断非零时,就跳到clr [w0++]指令进行数据清零,知道所有数据清零后才退出循环。
五、跳转主程序
以上单片机在启动前所有配置设置完毕后,就要跳到主程序了,只需一条指令:
goto _main
六、启动文件完整代码
.include "..\include\p33EP128MC506.inc"
.section .start_section,code
.global __reset
.global _main
__reset:
/*------------关闭中断----------*/
mov SR,w0
mov #0x00e0,w1
ior w0,w1,w0
mov w0,SR
/*------------关闭看门狗----------*/
mov RCON,w0
mov #0xffdf,w1
and w0,w1,w0
mov w0,RCON
/*------------堆栈设置----------*/
mov #__SP_init,w15 ;堆栈的开始
mov #__SPLIM_init,w0
mov w0,SPLIM ;堆栈限制寄存器
/*------------RAM清零----------*/
mov #0x1000,w0
mov #0x5000,w1
clr [w0++]
xor w0,w1,w2
bra NZ,$-4
/*------------主程序跳转----------*/
goto _main
.end
启动先从__reset ,汇编要以.end 结束文件。链接文件定义了 复位跳转地址,复位跳转地址就是__reset。所以我们的启动文件从__reset 处开始往下执行