b . 和 jmp $ 相同,自己在死迴圈
import ,定義表示這是乙個外部變數的標號,不是在本程式定義的
export ,表示本程式裡面用到的變數提供給其他模組呼叫的。
以上兩個在彙編和c語言混合程式設計的時候用到
剛看到一篇不錯的blog,解說c和彙編混編的,雖然貌似是翻譯ads文件的,不過寫的挺不錯,通俗容易懂,可以看看
其實彙編呼叫c貌似很簡單
b main 就完了,直接跳過去,那傳遞引數怎麼辦?根據《嵌入式系統 boot loader 技術內幕》裡面說的用彈簧床什麼的來結局,不過暫時理解不了。
用ads的乙個專案中同時放彙編的s檔案和c語言檔案的話,那麼整個連線出來,程式預設從c語言的main函式那裡作為入口,剛才試了一下,發現解決辦法。方法是,先將彙編的入口標籤export出來,
area adrlabel, code, readonl
import main
export start
entry
start
mov r0,#10 ; 沒有用,純粹為了方便看
b main
b .
end這樣宣告了乙個start的標籤提供給外面引用,然後import宣告需要引用乙個c語言的main函式,好了,在修改一下連線屬性,image entry point 那裡填 「start」 將映象的開始點指向start,那麼執行的時候,就先執行start那裡的匯程式設計序,而不是先執行c裡面的main函式了 :)
adr 裝載位址,不過位址範圍不能大,4kb 空間
編譯器會根據需要彙編成 add sub 指令的。
如果裝載的位址比較大,則需要用 adrl 指令。
好了,貌似今天終於搞懂那個文字池(literal pool)是什麼東西了。
根據現在的理解,大概是這樣的:
首先,因為arm一條指令只有32位,所以只能通過mov指令裝載乙個單位元組,8位的理解數,最大是 255 。遇到需要裝載32位立即數的時候,編譯器採取了乙個叫文字池的辦法,將立即數放在那裡,然後通過pc指標的偏移來取立即數。這個文字池是編譯器自己取搞的,一般放在**的後面,條件是**長度不能超過4kb,否則編譯出錯,這個時候可以用一條ltorg 指令強制將文字池定位在4k範圍內,那就ok了~~~
不過咱們的目標是寫bootloader,估計應該不用很擔心這個問題,放心的用就是了。
其實ads目錄下面有個例子就是說明這個問題的,下面的小例子摘取自ads目錄下面的
examples\asm\adrlabel.s
func2
ldr r2,=0x55555555
mov pc,lr
; ltorg
datspace 4200
end因為dat空出了 4200 位元組的空間,已經大於4k了,如果不加 ltorg 指令的話,那麼文字池會分配在4200位元組空間之後,超過4k,所以那個 ldr r2,=0x55555555 指令會出錯的,然而我們如果用 ltorg 指令將文字池強制分配在那4200位元組空間之前,那就解決問題了。自己試試就是了,很簡單的~~~
expor和import的用法
1.export 模組是獨立的檔案,該檔案內部的所有的變數外部都無法獲取。如果希望獲取某個變數,必須通過export輸出 profile.js export var firstname michael export var lastname jackson export var year 1958 ...
ES6學習 模組化 import和export
關於js模組化的使用,大家肯定不陌生,現有的主要兩種 cmd和amd,還有一種相容cmd和amd寫法的umd。一般前端框架都支援amd,而node.js採用的是cmd的模組語法。es6中規範化了模組的匯入和匯出語法,在規範的15.2章節中。現在瀏覽器還都不支援,想要嘗試的可以使用traceur或者b...
import和 include和 class用法
include 用於對系統檔案的引用,編譯器會在系統檔案目錄下去查詢該檔案。include xx.h 用於對使用者自定義的檔案的引用,編譯器首先會去使用者目錄下查詢,然後去安裝目錄,最後去系統目錄查詢。注意 include 如果class a 匯入了class b,class b的標頭檔案裡又匯入了...