首先,声明我是借的yichangzyh童鞋的这块mini板来耍耍,以下有什么不对的地方,欢迎大神拍板砖过来.... 大家可以相互交流哈
Digital_IO相信大家,都运行过把。当进入Debug状态后,在Startup.asm汇编文件,我们可以看到标注为黄色的该行指令表示当前的PC指针指向的指令,前面的圆圈表示设置断电,如果点击前面的箭头还可以直接跳转执行该行指令。
这里,单步运行(Step In /F6),程序按以下顺序执行:
MOVW A, #STACK_TOP
MOVW SP, A
//set stack pointer ,也就是设置堆栈指针。STACK_TOP是用伪指令定义的,这就是我们之前设置环境是所给的值。而#STACK_TOP也就是堆栈的首地址,一般我们可以把它指示最大的RAM地址,因为堆栈是向地址减少的方向生长。执行完后,PC:C023 A:010E SP:010E //
-----------------------------------------------------
57: MOVW A, PS
58: MOVW A, #0x07FF
59: ANDW A
60: MOVW PS, A
// set register bank is 0 (执行之前,PS:0030(初始值 RP:00 DP:0 CCR:30 执行之后 PS : 0030) 为了使用第 0 组通用寄存器,必须把 RP 设置为 0,尽管RP 初始为 0; 这里用到的是与运算,先将 PS-->A, 之后 #0x07FF-->A 并且 A-->T ,再将A与T相位与,最后放到PS中。
-----------------------------------------------------------
65: MOVW A, PS
66: MOVW A, #0x0030
67: ORW A
68: MOVW PS, A
//set ILM to the lowest level(3),这和上面的意思差不多,只不过是把 PS:CCR 中的IL1:IL 置为1:1 ,表示当前无中断发生。
--------------------------------------------------------
73: #macro ICOPY src_addr, dest_addr, src_section
74: MOVW EP, #\src_addr
75: MOVW A, #\dest_addr
76: MOVW A, #SIZEOF (\src_section)
77: CALL LMEMTOMEM
78: #endm
// 这应该是个参数宏定义,就是把ROM中的数据拷贝到RAM中去,三个参数为源地址,目标地址,大小。而LMEMTOMEM 是通过外部声明(.IMPORT)来引入的,通过反汇编窗口可以看到此函数的完整形式。