这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » yichangzyh的试用手记之一_对Startup.asm理解

共2条 1/1 1 跳转至

yichangzyh的试用手记之一_对Startup.asm理解

工程师
2010-12-18 16:38:55     打赏

首先,声明我是借的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) 为了使用第 组通用寄存器,必须把 RP 设置为 0,尽管RP 初始为 0; 这里用到的是与运算,先将 PS-->A, 之后 #0x07FF-->A 并且 A-->T  ,再将AT相位与,最后放到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)来引入的,通过反汇编窗口可以看到此函数的完整形式。





关键词: yichangzyh     试用     手记     之一     Start    

工程师
2010-12-18 16:42:16     打赏
2楼

ICOPY _ROM_INIT, _RAM_INIT, INIT

ICOPY _ROM_DIRINIT, _RAM_DIRINIT, DIRINIT

// copy initial value *CONST(ROM) section to *INIT(RAM) section,使用上述宏指令进行拷贝的,是把ROM中的两个段(SECTIONINT,DIRINIT (ROMRAM下划线后面的段名可以由用户定义)复制到RAM中,这样程序就可以在RAM中运行,此时我们才可以在片上的FlashROM)进行读写、擦除等操作。可以从程序中看出,数据从ROM拷贝到RAM分如下四步:首先,用.IMPORT导入段名RAMCODE。之后,定义有关段的属性,如大小,类型 (此为CODE类型),对齐等。最后,就可以执行ICOPY宏指令了。如下:

                           .IMPORT _RAM_RAMCODE ; point 1 added he

                               .IMPORT _ROM_RAMCODE ; point 2 added here

                    .SECTION RAMCODE, CODE, ALIGN=1 ; point 3 added here

           ICOPY _ROM_RAMCODE, _RAM_RAMCODE, RAMCODE; point 4 added here

 

--------------------------------------------------------------

#macro FILL0 src_section

MOVW A, #\src_section

MOVW A, #SIZEOF (\src_section)

CALL LMEMCLEAR

#endm

 

FILL0 DIRDATA

FILL0 DATA

// zero clear of *VAR section,这句和上面基本相同,只不过是对数据段清0data类型),用来存储临时变量。

 

 

----------------------------------------------

98 CALL _main

// call main routine,哈哈,终于可以来用你定义的主函数了....


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]