天天看點

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指令用于在兩個操作數上進行邏輯或運算,并把結果放置到目的寄存器中。

繼續閱讀