1.先看啟動**:
.text
.global _start
_start:
ldr sp, =4096
bl disable_watch_dog
bl memsetup
bl copy_2th_to_sdram
bl create_page_table
bl mmu_init
ldr sp, =0xb4000000
ldr pc, =0xb0004000//此處,指定了跳轉到main.o處執行(在lds檔案中指定了main.o在sdram的位置)
#bl main
halt_loop:
b halt_loop
2.然後看lds檔案:
sections
second 0xb0004000 : at(2048)//此處,指定main.o執行在0xb0004000
}3.然後看主函式兩種不同的書寫格式
第一種格式為:(正確)
void delay(unsigned int time);//delay函式為宣告,無**,不產生操作指令
int main(void)
void delay(unsigned int time)
反彙編為:
b0004000:的入口函式為main,位址為b0004000
b0004000:e3a0320a movr3, #-1610612736; 0xa0000000
b0004004:e5932050 ldrr2, [r3, #80]
(省略)
b0004024 :
b0004024:e3500000 cmpr0, #0; 0x0
b0004028:d1a0f00e movlepc, lr
第二種格式為:(有問題)
void delay(unsigned int time)//函式,產生操作指令,入口位址的函式發生了變化
int main(void)
反彙編為:
b0004000 ://b0004000的入口變成了delay函式,不能進入main函式
b0004000:e3500000 cmpr0, #0; 0x0
b0004004:d1a0f00e movlepc, lr
(省略)
b0004018 :
b0004018:e3a0320a movr3, #-1610612736; 0xa0000000
b000401c:e5932050 ldrr2, [r3, #80]
總結:
1.如果用ldr pc, =***指令跳轉到乙個可重定位檔案執行,那個我們希望成為入口函式的函式要寫在最前邊,其他產生操作指令的動作、函式定義要寫在他的後邊。
2.如果入口函式呼叫其他函式,而這個函式又在本檔案中定義,那這個函式一樣會在入口函式前展開。
3.解決辦法:
a.把入口函式需要呼叫的函式都寫在另乙個檔案中,然後用#include包含過來
b. 把要呼叫的函式,加上宣告:static inline ,變成內聯函式。
API函式執行可執行檔案
shellexecute hwnd hwnd,父視窗控制代碼 lpcstr lpoperation,操作型別 lpcstr lpfile,要進行操作的檔案或路徑 lpcstr lpparameters,當lpoperation為 explore 時指定要傳遞的引數,通常設為null lpcstr l...
linux 執行可執行檔案
1 首先,需要了解一下a.out這個目標檔案。a.out在linux下是elf executable linkable format 檔案格式,該目標檔案由乙個檔案頭 段 資料段 已初始化 從定位資訊區 符號表及符號名字字串構成,如下左圖所示,經過鏈結後生成執行檔案如下右圖所示,需要說明的是1 bs...
Linux的可執行檔案
linux的可執行檔案 用ls f命令,後買帶 的就是可執行檔案。linux下,當你使用.執行乙個程式時,首先是shell來接管你的輸入,然後用fork派生子程序,最後用execv系列將你的那個程式的 交給核心 1。檢查你執行的檔案的屬性,其屬性在它的i節點中描述,如果你的那個檔案不是可執行的屬性,...