2011-02-13 298 views
1

我有一個關於ARM BLX指令的問題,特別是關於BLX RX指令。在ARM手冊中指出,對於BLX標籤,標籤應該在32MB範圍內。在我的代碼中,我將R0寄存器設置爲指向address1。我的當前地址和地址1(目的地址)之間的距離大約是0x05000000。ARM BLX指令範圍(絕對值)

當我到達指令時,它崩潰了(地址1中的代碼是ARM,所以T模式沒有問題)。在BLX中使用絕對值時有沒有限制?我應該使用膠合板嗎?

謝謝!

回答

2

您可以使用任何地址作爲BLX RX形式的RX寄存器。它將執行手臂中描述的操作。

 
if ConditionPassed(cond) then 
    target = Rm 
    LR = address of instruction after the BLX instruction 
    CPSR T bit = target[0] 
    PC = target AND 0xFFFFFFFE 

如果沒有代碼,調用或代碼被稱爲是拇指模式,那麼你可能是罰款,確保在這種情況下,你給它是一個零地址,所以LSb。您需要實際擁有0x05000000的代碼,並且需要代碼來處理分支鏈接,這意味着如果它進行更多bl樣式調用,它將維護鏈接寄存器(r14)。同樣,如果你在一個被其他人調用的函數內進行blx調用,你需要在進行blx調用之前保留r14,並且恢復r14和/或從函數返回時做任何將該值放回r15(pc)的值。

反彙編/ objdump列表的代碼示例或代碼段對於進一步幫助您解決此問題會很有用。包含blx和正在調用的代碼的代碼。

0

該限制僅適用於PC相對分支(在指令中編碼的偏移量),而不是寄存器分支。

所以崩潰的原因是別的。你的處理器是什麼?你真的在'address1'有代碼嗎?它究竟在哪裏崩潰?