存儲控制器

看了這個章節以後,對於彙編程序中有兩處需要學習

 

==================================

ldr pc, =on_sdram

 

on_sdram:

      ldr sp, =0x34000000

      bl  main

==================================

arm爲了支持nand,專門設計了一個內部4k的ram(我們稱爲steppingstone), 當選擇從nand啓動的時候,nand的前4k的數據會被複制到steppingstone中,然後跳到內部ram開始執行第一條程序指令。我們爲了實驗存儲控制器,打算把代碼從steppingstone複製到SDRAM中運行,這裏就有個問題,程序一開始是在steppingstone中運行的,地址是0x0~0x1000,但是外部SDRAM的地址根據開發板設計,地址爲0x300000000~0x3fffffffff,這就要求代碼能夠自己跳轉到SDRAM中。

arm中的跳轉指令分爲兩類,一類是BL,這是相對跳轉,編譯器會計算出跳轉到某處需要偏移的變量,然後再當前pc上加上偏移變量,從而實現跳轉,這個轉移的範圍是+/- 32M.因爲是相對指令,與程序塊存放的位置沒有關係。

還有一種是向pc賦值,這是絕對跳轉。賦值的方式有很多 上例 ldr pc, =on_sdram,就是將label 'on_sdram'的地址賦值給pc,因爲on_sdram作爲label,在編譯的時候由連接器解析該地址,所以和連接器的參數有關係。當我們在連接的時候給了參數 -Ttext 0x30000000, 這就意味着label的地址是以0x30000000作爲基址算出來的。所以在steppingstone中使用 ldr pc, =on_sdram, 也就實現了到SDRAM的跳轉。

 

發佈了31 篇原創文章 · 獲贊 0 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章