2012-03-02 61 views
1

我有一個問題,支持分支指令B arm926ejs_reset_handler跳轉到標籤arm926ejs_reset_handler:,因此忽略之間的代碼。我不知道爲什麼有人會這樣做?忽略重要數據的分支指令?

和一些額外的解釋。標籤__start:是該程序的入口點。分支指令忽略的行是啓動ISROM應該在啓動時獲得的參數。 但是,如果我們跳過它們,啓動ISROM如何獲得這些參數?它對我沒有任何邏輯。

__start: 
arm926ejs_reset: 
B  arm926ejs_reset_handler 

    .word 0x41676d69 
    .word 0,0,0,0,0 
image_type: 
    .word 0x0000000A 
sizeOfPermanentCode:  
    .word (__image_size) 
    .word 0,0 
bootparameter: 
    .word 0 
    .word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 

arm926ejs_reset_handler: 
+0

這就是分支所做的事情,它在某處分支或跳轉。就像C中的goto一樣。如果它沒有這樣工作,那將會非常糟糕,你不能編寫程序。程序櫃檯與它可以訪問的內容完全無關。其他指令集使用跳轉而不是分支,在這種情況下兩者意味着同樣的事情,根據定義,代碼執行分支或跳轉到另一個路徑,從而留下它所在的路徑。 – 2012-03-02 14:38:14

+0

也閱讀你的手臂手冊,以瞭解前幾個/許多取決於體系結構,內存(字)位置是重置向量,所以爲了避免問題,您必須使用分支到某處或ldr pc,某些東西要分支到某處爲了正確使用異常表。這正是這個代碼正在做的。 – 2012-03-02 14:40:14

+0

作爲一個入口點只與加載程序相關(例如加載linux二進制應用程序的操作系統),這似乎是具有異常表的啓動代碼,並且一旦將此二進制文件置於ram/rom啓動時啓動標籤無關處理器。 – 2012-03-02 14:42:12

回答

3

有數據和代碼之間的差 - 代碼中包含有執行指令,而數據是由代碼中使用。根本的區別是數據(通常)不能執行。

因此,當開始的房間用作數據的存儲空間時,代碼需要跳過數據,否則數據會被解釋爲代碼,這很可能會導致非法指令和崩潰。

當然,如果代碼位於當前程序計數器之前(跳轉後),則代碼可以訪問該數據 - 從代碼的角度來看,如果數據位於代碼之前或之後,則不會產生影響。

2

這只是分支在一些數據 - 該代碼可以在此獲得的數據通過索引使用__startarm926ejs_reset爲基址尋址。