天天看点

uboot中start.s源码指令

本文参考文档: https://www.crifan.com/files/doc/docbook/uboot_starts_analysis/release/html/uboot_starts_analysis.html#globl

  1. .globl _start

    globl是关键字,相当于c语言中的extern,声明此变量,并且告诉链接器此变量是全局的,外部可以访问。

  2. _start:b reset

    _start后面加上一个冒号’:’,表示其是一个标号Label,类似于C语言goto后面的标号。

_start的值就是这个代码的位置,此处即为代码的最开始,相对的0的位置。

而此处最开始的相对的0位置,在程序开始运行的时候,如果是从NorFlash启动,那么其地址是0,_start=0。

如果是重新relocate代码之后,就是我们定义的值了。

而_start标号后面的:b reset

就是跳转到对应的标号为reset的位置。

  1. ldr指令

    格式:ldr{条件} 目的寄存器,<存储器地址>

用于从存储器中将一个32位的字数据传送到目的寄存器中。

ps:当程序计数器PC作为目的寄存器时,指令从存储器中读取的字数据被当作目的地址,从而可以实现程序流程的跳转。

  1. .word

    分配一个4字节的地址空间。

eg._undefined_instruction: .word undefined_instruction

c语言表示:_undefined_instruction=&undefined_instruction;

  1. .balignl
  2. .balignl 16,0xdeadbeef

接下来的代码,都要16字节对齐,不足之处,用0xdeadbeef填充。

  1. bl

    reset: bl save_boot_params

引起处理器转移到“save_boot_params”处开始执行,并将下一条指令的地址拷贝到R14,可实现子程序的返回。

  1. 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指令用于在两个操作数上进行逻辑或运算,并把结果放置到目的寄存器中。

继续阅读