彙編裡 import 和export

2021-09-30 10:01:41 字數 1540 閱讀 1610

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的標頭檔案裡又匯入了...