2).globl 关键字:声明一个全局的标号,全局标号,其他可见,可以使用这个标志。
.globl _start :把_start标号声明为全局的,其他的文件 ,C,链接文件,其他汇编文件都可见。
3)标号定义: “标号:” ,如: _start: ,定义一个_start标号。一个标号代表一个地址。
4).balignl关键字:在当前位置以指定对齐方式存放数字。
.balignl 16,0xdeadbeef 在当前代码所在的地址开始找到第一个16的整数倍地址存放0xdeadbeef
5).word关键字:在当前位置存放一个数值。如:
_TEXT_BASE:
.word TEXT_BASE
代表在当前地址存放 TEXT_BASE 所代表的数值。
6)可以使用C语言的预处理功能。
#if defined(CONFIG_xyd2440_LED_DEBUG)
…..
#endif
上面代码意思是如果定义了CONFIG_xyd2440_LED_DEBUG宏,就编译其中包含的代码段。
#define S_FRAME_SIZE 72
#define S_OLD_R0 68
上面使用C语言的宏定义功能定义数值。
7) 注释:和C语言一样。同时支持使用@注释。 可用:// , /* */, @
8)汇编代码专用宏定义:以 .macro 开头 后接宏名,中间宏代码,最后是 .endm 做为结束。
.macro bad_save_user_regs
sub sp, sp, #S_FRAME_SIZE
stmia sp, {r0 - r12} @ Calling r0-r12
ldr r2, _armboot_start
sub r2, r2, #(CONFIG_STACKSIZE+CFG_MALLOC_LEN)
sub r2, r2, #(CFG_GBL_DATA_SIZE+8) @ set base 2 words into abort stack
ldmia r2, {r2 - r3} @ get pc, cpsr
add r0, sp, #S_FRAME_SIZE @ restore sp_SVC
add r5, sp, #S_SP
mov r1, lr
stmia r5, {r0 - r3} @ save sp_SVC, lr_SVC, pc, cpsr
mov r0, sp
.endm
9) .align关键字: 控制代码对齐方式
ARM的.align 5就是2的5次方对齐,也就是4字节对齐,
3.3 分析 :
//异常向量表定义
.globl _start //把 _start 声明为全局标号
_start: b start_code //第1条指令,复位异常
ldr pc, _undefined_instruction //未定义异常
ldr pc, _software_interrupt //软中断异常
ldr pc, _prefetch_abort //预取指中止异常
ldr pc, _data_abort //数据中止异常
ldr pc, _not_used
ldr pc, _irq //IRQ中断异常
ldr pc, _fiq //FIQ中断异常
_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
当整个u-boot流程走完之后,就真正进入linux的启动系统了。
所以,如果对u-boot整理流程通过软件来认识一边的话,就完全知道linux在启动时,干了哪些事。就像window启动时,会出现一些信息,告诉你当前执行到哪里,执行了什么事,一目了然。