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...