[英]ARM assembly branch to address inside register or memory
我想知道在ARM程序集中哪些指令可用於分支存儲在某個內存地址中的地址或標簽。
例如,我們可以使用B LABEL跳轉到LABEL。 但現在目的地只能在運行時知道,它存儲在一些已知的內存位置,是否有類似B [地址]的東西?
謝謝!
有什么像B [地址]?
不。先將地址加載到寄存器中,然后使用BX
跳轉到它:
@ In this example, R0 points to the address to jump to
LDR R1, [R0]
BX R1
您也可以將地址直接加載到PC
(雖然我不確定這是否適用於所有ARM體系結構,因此請參閱相關參考文檔):
@ In this example, R0 points to the address to jump to
LDR PC, [R0]
ARM體系結構的一個重要設計范例是,只有極少數指令可以在內存上運行,這可能是一個緩慢的操作:只有LDR
和STR
。 所以內存中沒有B [label]
。
對於問題的注冊部分,回答這類問題的一個好方法是查看指令摘要部分,按類型分組說明。 ARMv7和ARMv8中有一個用於分支指令:
ARMv7 A4.3“分支指令”
如下所述: https : //stackoverflow.com/a/32305904/9160762 ,在ARMv7中,您可以使用BX register
,還有一個BLX register
,用於設置函數調用的返回地址。
從該表中,我們知道哪些使用寄存器,因為只有那些可以跳轉到“任何”地址:使用immediates的那些具有有限的范圍,因為完整地址不適合每個指令編碼的固定4字節。
最小的可運行示例 。
:在ARMv7的另一種選擇,在提到https://stackoverflow.com/a/32305904/9160762是ldr
到PC,PC以來就是r15
:
ldr pc, [r0]
但是,在具有專用寄存器的ARMv8中,這是不可能的。 B1.2.1“AArch64州的登記冊”說:
軟件無法直接寫入PC。 它只能在分支,異常條目或異常返回上更新。
ARMv8 C3.1“分支,異常生成和系統指令”
在那一節中,我們將了解BLR
, BR
和RET
。
BR
就像BX
,但沒有X
因為沒有拇指可以擔心。
最小的可運行示例 。
然后,文檔說RET
與BR
類似,不同之處在於它:
x30
,這是BL
放置返回地址的地方
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.