02.07.2013 Views

Uboot中start.S源码的指令级的详尽解析

Uboot中start.S源码的指令级的详尽解析

Uboot中start.S源码的指令级的详尽解析

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

DA 每次传送后地址减1;<br />

DB 每次传送前地址减1;<br />

FD 满递减堆栈;<br />

ED 空递减堆栈;<br />

FA 满递增堆栈;<br />

EA 空递增堆栈;<br />

{!}为可选后缀,若选用该后缀,则当数据传送完毕之后,将最后的地址写入基址寄存器,否<br />

则基址寄存器的内容不改变。<br />

基址寄存器不允许为R15,寄存器列表可以为R0~R15的任意组合。<br />

{∧}为可选后缀,当指令为LDM且寄存器列表中包含R15,选用该后缀时表示:除了正常的数据<br />

传送之外,还将SPSR复制到CPSR。同时,该后缀还表示传入或传出的是用户模式下的寄存器,<br />

而不是当前模式下的寄存器。<br />

指令示例:<br />

STMFD R13!,{R0,R4-R12,LR} ;将寄存器列表中的寄存器(R0,R4到<br />

R12,LR)存入堆栈。<br />

LDMFD R13!,{R0,R4-R12,PC} ;将堆栈内容恢复到寄存器(R0,R4到<br />

所以,此行的含义是,<br />

R12,LR)。”<br />

将r0到r12的值,一个个地传送到对应的地址上,基地址是sp的值,传完一个,sp的值加4,一<br />

直到传送完为止。<br />

此处,可见,前面那行代码:<br />

sp = sp - 72<br />

就是为此处传送r0到r12,共13个寄存器,地址空间需要13*4=72个字节,<br />

即前面sp减去72,就是为了腾出空间,留此处将r0到r12的值,放到对应的位置的。<br />

ldr r2, _armboot_start<br />

此处的含义就是,将<br />

中的值,参考前面内容,即为_start,<br />

而_start的值:<br />

从 Nor Flash启动时:_stat=0<br />

relocate代码之后为:_start=TEXT_BASE=0x33D00000<br />

此处是已经relocate代码了,所以应该理解为后者,即_start=0x33D00000<br />

所以:<br />

r2=0x33D00000<br />

此处<br />

r2<br />

sub r2, r2, #(CONFIG_STACKSIZE+CFG_MALLOC_LEN)<br />

= r2 - ( CONFIG_STACKSIZE+CFG_MALLOC_LEN)<br />

= r2 – (128*1024 + 256*1024)<br />

= 0x33D00000 - 384KB<br />

= 0x33CA0000

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!