我想在ARM程序集中执行以下操作,只有24个字节的代码/数据。有可能吗?
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 :(得分:1)
您的解决方案实际需要36个字节,因为第一个ldr可能会导致在您的文本中生成包含MEMLOC1地址的内存池条目(除非您的链接器足够智能以修复它)。
在24个字节中,您可以通过将数据移近来实现此目的,以便生成与pc相关的地址。
.text
_go:
ldr r0, L_offset
add pc, pc, r0
L_offset:
.word 0x12345678
偏移量可能需要减去几个字节,以补偿递增的pc。