ARM9學習筆記之 彙編

2021-06-05 10:36:01 字數 958 閱讀 3438

arm系列晶元與pc系列(可能我說法不太準確)晶元在指令設計上就有本質的區別。arm中每條指令是精簡指令集要麼是32位,要麼是16位。而pc的指令是複雜指令集,一條指令可以由多個位元組組成。

1. 關於函式呼叫方法

在arm彙編中,函式呼叫非常靈活。

(1)bl指令

bl  initmem      ;呼叫

initmem

....

mov pc , lr ;返回

bl指令在編譯時,是以當前指令位址為基準相對跳轉。由於指令中位址區域為16位,其中1位作前後標誌,剩下15位作為跳轉範圍。所以跳轉位址範圍為當前位址前後32mb位址。

(2)ldr pc, = xmain

ldr lr, =endmain  ; 儲存絕對返回位址

ldr pc, =xmain ; 絕對位址跳轉

endmain

b endmain

當編譯器在對ldr巨集進行編譯時,xmain作為絕對位址賦給pc。

(3)bx

ldr r0, =xmain

bx r0

也是絕對位址跳轉。在跳轉中,可以進行arm與thumb指令集轉換。

2.關於ldr與adr巨集

在做「2.6.8記憶體驅動實驗」時,我關注了initmemloop前乙個指令"adr r2, memdata"。嘗試著將它換成 ldr 進行實驗。

經過反彙編與暫存器跟蹤,我看到它們的區別:

ldr r2, =memdata ; r2=執行位址

adr r2, memdata ; r2=載入位址

ldr r2, memdata ; r2=0x22000000

adr r2, =memdata; 編譯錯誤

ARM9學習筆記之 MMU

我記得有一次我去應聘arm linux軟體工程師。結果被問到arm中的虛擬記憶體是怎麼管理的。由於我只對x86平台下的mmu了解,所以我被問倒了。原來我所學的只是皮毛。還有很多東西值得我去深入。要做arm linux下的驅動,熟悉虛擬記憶體應該是必須的。arm9中的虛擬記憶體是怎麼實現的呢?以下是我...

ARM9學習筆記之 MMU

我記得有一次我去應聘arm linux軟體工程師。結果被問到arm中的虛擬記憶體是怎麼管理的。由於我只對x86平台下的mmu了解,所以我被問倒了。原來我所學的只是皮毛。還有很多東西值得我去深入。要做arm linux下的驅動,熟悉虛擬記憶體應該是必須的。arm9中的虛擬記憶體是怎麼實現的呢?以下是我...

ARM9學習筆記之 SDRAM實驗

學了點東西,寫點總結。以下是我在做 page130,2.6.8記憶體驅動實驗總結。我按照書上的指示,完成了 的編寫。對專案作如下配置 上述的配置中 ro base 0x30000000 告訴linker,本程式將被載入到 0x30000000 上執行。實驗程式的功能是,程式最初是在0x0000000...