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

相关文章
8086 汇编笔记(九):call 指令 和 ret 指令
8086 汇编笔记(九):call 指令 和 ret 指令
|
7月前
|
Unix Linux
【Linux】常用的基本命令指令②
【Linux】常用的基本命令指令②
|
7月前
|
关系型数据库 Java Android开发
CMD常用的指令
CMD是Windows操作系统的命令行操作工具,用户可以通过输入命令来完成系统或程序的操作。以下是一些常用的CMD指令
|
7月前
|
存储 安全 Linux
Linux sync 指令的作用
Linux sync 命令的作用是确保所有未写入磁盘的数据被立即同步至物理存储介质上,以保护文件系统的一致性和防止意外关机时的数据丢失。虽然 sync 在日常交互式使用中可能不常直接调用,但许多高级操作或脚本中会包含此命令来保证数据安全。
188 0
|
内存技术
判断uboot启动方式:norflash还是nandflash
判断uboot启动方式:norflash还是nandflash
240 0
判断uboot启动方式:norflash还是nandflash
uboot命令添加记录
uboot命令添加记录
135 0
uboot命令添加记录
|
缓存 网络协议 Shell
cmd指令
cmd指令
167 0
|
Docker 容器
Dockerfile文件中CMD指令与ENTRYPOINT指令的区别
本文是博主学习docker 制作镜像指令的记录,希望对大家有所帮助
199 0
Dockerfile文件中CMD指令与ENTRYPOINT指令的区别
|
应用服务中间件 Shell Linux
FROM 和 RUN 指令的作用
FROM 和 RUN 指令的作用
100 0