- .globl _start
globl是关键字,相当于c语言中的extern,声明此变量,并且告诉链接器此变量是全局的,外部可以访问。 - _start:b reset
_start后面加上一个冒号’:’,表示其是一个标号Label,类似于C语言goto后面的标号。
_start的值就是这个代码的位置,此处即为代码的最开始,相对的0的位置。
而此处最开始的相对的0位置,在程序开始运行的时候,如果是从NorFlash启动,那么其地址是0,_start=0。
如果是重新relocate代码之后,就是我们定义的值了。
而_start标号后面的:b reset
就是跳转到对应的标号为reset的位置。
- ldr指令
格式:ldr{条件} 目的寄存器,<存储器地址>
用于从存储器中将一个32位的字数据传送到目的寄存器中。
ps:当程序计数器PC作为目的寄存器时,指令从存储器中读取的字数据被当作目的地址,从而可以实现程序流程的跳转。
- .word
分配一个4字节的地址空间。
eg._undefined_instruction: .word undefined_instruction
c语言表示:_undefined_instruction=&undefined_instruction;
- .balignl
- .balignl 16,0xdeadbeef
接下来的代码,都要16字节对齐,不足之处,用0xdeadbeef填充。
- bl
reset: bl save_boot_params
引起处理器转移到“save_boot_params”处开始执行,并将下一条指令的地址拷贝到R14,可实现子程序的返回。
- mrs/msr bic/orr
7.1格式:
mrs{条件} 通用寄存器,程序状态寄存器(cpsr或spsr)
mrs指令用于将程序状态寄存器的内容传送到通用寄存器中。使用情况1)需要改变程序状态寄存器的内容时 2)异常处理或进程切换时
7.2格式:
msr{条件} 程序状态寄存器(cpsr或spsr)_<域>,操作数
msr指令用于将操作数的内容传送到程序状态寄存器的特定域中。
7.3格式:
bic{条件}{S} 目的寄存器,操作数1,操作数2
bic指令用于清除操作数1的某些位,并把结果放置到目的寄存器中。
7.4格式:
orr{条件}{S} 目的寄存器,操作数1,操作数2
orr指令用于在两个操作数上进行逻辑或运算,并把结果放置到目的寄存器中。