uboot中start.s原始碼指令

weixin_33806914發表於2018-05-21

本文參考文件: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指令用於在兩個運算元上進行邏輯或運算,並把結果放置到目的暫存器中。

相關文章