?
?
感覺一定要理解一些基本的概念,然后在看懂匯編的基礎上,再分析uboot的流程。
1.關于匯編的語法
這里有兩套匯編的語法:分為ARM公司的標準ARM匯編語言和GNU對ARM支持的GNU ARM匯編。ARM標準匯編語言即ARM公司的開發工具ADS里用的匯編語言;GNU匯編即在LINUX下用GCC編譯的匯編。兩者語法有少許差異。因此,通常我們下載的LINUX下的ARM接口代碼放到ADS下是不能編譯通過的,需要進行少許修改。
GNU AS語法即AT&T匯編語法,uboot用到的語法。
2.標簽的含義
?
.globl _start _start: b reset?
標簽就是在某行程序代碼前作一個標記,標簽代表的是這行代碼的地址。
?
.globl _armboot_start _armboot_start: .word _start?
.word expression就是在當前位置放一個word型的值,這個值就是expression ,此處的含義就是建立一個全局標簽_armboot_start,在這個位置上放置_start的值(可以這樣理解,_armboot_start是一個地址,這個地址中的內容是_start),則下面的語句會把地址_armboot_start處的內容(_start)裝載到r2中。
?
ldr r2, _armboot_start?
這樣做的目的是因為LDR指令的格式為:LDR{條件} ? ?Rd, <地址>。
3..word 0x0badc0de
含義:保留一個字,初始化一下。實際的值應該在運行時計算出來。(badcode嗎,呵呵)。
4.關于判斷是否拷貝到ram
如果是debug下,uboot直接運行在ram中,從而得到的_start值和TEXT_BASE是相等的,不需要拷貝。如果從flash啟動,_start為0x0,TEXT_BASE是sdram的地址,二者是不相等的,需要拷貝。(TQ2440的SDRAM為64M,bank6,地址空間為0x30000000-0x34000000,TEXT_BASE設置為0x33D000000,即0x33D00000-0x34000000為uboot使用的空間+bss和其他的空間)。
見映射圖
5.匯編中調用c函數
遵循ATPCS(ARM-THUMB procedure call standard)標準。
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
