2012-02-28 52 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