2012-02-28 57 views
1

我想在ARM程序集中僅用24字節的代碼/數據執行以下操作。可能嗎?優化ARM絕對跳轉

PC = [MEMLOC] + PC

或者,投入的話,我想基於向前跳轉PC相對偏移,其從存儲器中讀取。

從MEMLOC讀必須是完整的32位字的值

我可以做到這一點很容易地16 [<之前從32 - 更新]字節(使用標準的LDR和ADD指令),但尋求優化離開一條指令。任何人都知道這是可能的嗎?我認爲有些方法可以處理從內存中讀取的大約20位字,但對於完整的32位字可能無法實現。

更新:這是我:

LDR R12, =MEMLOC1 
ADD R12, PC, R12 
LDR PC, [R12] 

MEMLOC1: (contains 32-bit word) 
+0

您是否期望通過刪除一條指令來節省大筆費用?我想,訪問內存來獲得這個抵消可能會消除任何收益。 – 2012-02-28 00:59:50

+0

告訴我們你現在正在努力改進的是什麼? – 2012-02-28 01:23:24

+0

我在原始文章中添加了一個更新,其中包含使用4個字節的指令和數據執行此操作的方法。實際上,我不需要從內存中讀取32位字,但從我所看到的,無法在指令內存儲32位值,因此這似乎很有必要。 – Locksleyu 2012-02-28 01:28:16

回答

1

您的解決方案,其實需要36個字節,因爲第一LDR可能會導致在你的文本中生成包含MEMLOC1的地址的存儲池條目(除非你的連接足夠聰明來解決這個問題)。

在24個字節中,您可以通過更靠近地移動數據來完成此操作,以便生成一個與PC相關的地址。

.text 
_go: 
    ldr r0, L_offset 
    add pc, pc, r0 
L_offset: 
    .word 0x12345678 

偏移量可能需要減去幾個字節來補償遞增的pc。

+0

感謝您的建議。但是,您的解決方案不起作用,因爲我想通過位於內存位置0x12345678處的內容來增加PC。一些東西(概念上)就像:add pc,[pc + r0]這不是一個真正的指令。我道歉,因爲我意識到我的初始文章描述了我想做的事情有點混亂。 – Locksleyu 2012-02-28 13:04:13