簡體   English   中英

ARM匯編分支,用於尋址寄存器或內存

[英]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體系結構的一個重要設計范例是,只有極少數指令可以在內存上運行,這可能是一個緩慢的操作:只有LDRSTR 所以內存中沒有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/9160762ldr到PC,PC以來就是r15

     ldr pc, [r0] 

    但是,在具有專用寄存器的ARMv8中,這是不可能的。 B1.2.1“AArch64州的登記冊”說:

    軟件無法直接寫入PC。 它只能在分支,異常條目或異常返回上更新。

  • ARMv8 C3.1“分支,異常生成和系統指令”

    在那一節中,我們將了解BLRBRRET

    BR就像BX ,但沒有X因為沒有拇指可以擔心。

    最小的可運行示例

    然后,文檔說RETBR類似,不同之處在於它:

    • 給出一個暗示,這應該代表一個函數返回
    • 寄存器在匯編時是可選的,默認為x30 ,這是BL放置返回地址的地方

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM