@对于ARM数据从内存到CPU之间的移动只能通过L/S指令,如:ldr r0,0x12345678为把0x12345678内存中的数据写到r0中,还有一个就是ldr伪指令,如:ldr r0,=0x12345678为把0x12345678地址写到r0中,mov只能完成寄存器间数据的移动,而且立即数长度限制在8位
_undefined_instruction: .word undefined_instruction
_software_interrupt: .word software_interrupt
_prefetch_abort: .word prefetch_abort
_data_abort: .word data_abort
_not_used: .word not_used
_irq: .word irq
_fiq: .word fiq
@.word为GNU ARM汇编特有的伪操作,为分配一段字内存单元(分配的单元为字对齐的),可以使用.word把标志符作为常量使用。如_fiq:.word fiq即把fiq存入内存变量_fiq中,也即是把fiq放到地址_fiq中。
.balignl 16,0xdeadbeef
@.balignl是.balign的变体
@ .align伪操作用于表示对齐方式:通过添加填充字节使当前位置
@满足一定的对齐方式。.balign的作用同.align。
@ .align {alignment} {,fill} {,max}
@ 其中:alignment用于指定对齐方式,可能的取值为2的次
@幂,缺省为4。fill是填充内容,缺省用0填充。max是填充字节@数最大值,如果填充字节数超过max, 就不进行对齐,例如:
@ .align 4 /* 指定对齐方式为字对齐 */
/*
*************************************************************************
*
* Startup Code (called from the ARM reset exception vector)
*
* do important init only if we don\'t start from memory!
* relocate armboot to ram
* setup stack
* jump to second stage
*
*************************************************************************
@保存变量的数据区,保存一些全局变量,用于BOOT程序从FLASH拷贝@到RAM,或者其它的使用。
@还有一些变量的长度是通过连接脚本里得到,实际上由编译器算出
@来的
_TEXT_BASE:
@因为linux开始地址是0x30000000,我这里是64M SDRAM,所以@TEXT_BASE = 0x33F80000 ???
.word TEXT_BASE /*uboot映像在SDRAM中的重定位地址*/
@TEXT_BASE在开发板相关的目录中的config.mk文档中定义, 他定
@义了代码在运行时所在的地址, 那么_TEXT_BASE中保存了这个地
@址(这个TEXT_BASE怎么来的还不清楚)
.globl _armboot_start
_armboot_start:
.word _start
@用_start来初始化_armboot_start。(为什么要这么定义一下还不明白)
/*
* These are defined in the board-specific linker script.
*/
@下面这些是定义在开发板目录链接脚本中的
.globl _bss_start
_bss_start:
.word __bss_start
@__bss_start定义在和开发板相关的u-boot.lds中,_bss_start保存的是__bss_start标号所在的地址。
.globl _bss_end
_bss_end:
.word _end
@同上,这样赋值是因为代码所在地址非编译时的地址,直接取得该标号对应地址。
@中断的堆栈设置
#ifdef CONFIG_USE_IRQ
/* IRQ stack memory (calculated at run-time) */
.globl IRQ_STACK_START
IRQ_STACK_START:
.word 0x0badc0de
/* IRQ stack memory (calculated at run-time) */
.globl FIQ_STACK_START
FIQ_STACK_START:
.word 0x0badc0de
#endif
/*
* the actual start code
*/
@复位后执行程序
@真正的初始化从这里开始了。其实在CPU一上电以后就是跳到这里执行的
reset:
/*
* set the cpu to SVC32 mode
*/
@更改处理器模式为管理模式
@对状态寄存器的修改要按照:读出-修改-写回的顺序来执行
@
31 30 29 28 --- 7 6 - 4 3 2 1 0
N Z C V I F M4 M3 M2 M1 M0
0 0 0 0 0 User26 模式
0 0 0 0 1 FIQ26 模式
0 0 0 1 0 IRQ26 模式
0 0 0 1 1 SVC26 模式
1 0 0 0 0 User 模式
1 0 0 0 1 FIQ 模式
1 0 0 1 0 IRQ 模式
1 0 0 1 1 SVC 模式
1 0 1 1 1 ABT 模式
1 1 0 1 1 UND 模式
1 1 1 1 1 SYS 模式