优化ARM绝对跳跃

时间:2012-02-28 00:50:24

标签: performance optimization assembly arm

我想在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)

1 个答案:

答案 0 :(得分:1)

您的解决方案实际需要36个字节,因为第一个ldr可能会导致在您的文本中生成包含MEMLOC1地址的内存池条目(除非您的链接器足够智能以修复它)。

在24个字节中,您可以通过将数据移近来实现此目的,以便生成与pc相关的地址。

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

偏移量可能需要减去几个字节,以补偿递增的pc。