ldr中的源和目标寄存器相同

时间:2012-04-17 10:26:20

标签: assembly arm

在ARM程序集中执行ldr r0,[r0]是否合法?

3 个答案:

答案 0 :(得分:3)

如有疑问,请始终参阅ARM体系结构参考手册,该手册可在arm.com上找到。它说:

The destination register. The SP can be used. The PC can be used, provided the
instruction is either outside an IT block or the last instruction of an IT block.
If the PC is used, the instruction branches to the address (data) loaded to the PC.
In ARMv5T and above, this branch is an interworking branch, see Pseudocode details of
operations on ARM core registers on page A2-12.

它没有说目标寄存器不能与基址寄存器相同。即,答案是肯定的,它们可以是相同的。

答案 1 :(得分:2)

是的,它将获取r0指向的值,并用它加载寄存器r0。 如有疑问,可以使用模拟器进行测试。我使用VBA GBA仿真器,虽然是GBA特有的,但它是一个优秀的ARM仿真器。要学习GBA编程的基础知识,以便进行这种测试,请访问this教程。

答案 2 :(得分:1)

编码对于ARMv4的arm和thumb指令集肯定有效。

请查看ARM ARM(ARM架构参考手册)(http://infocenter.arm.com),了解您感兴趣的系列。在这种情况下,ARM7是ARMv4,它与ARMv5 ARM集成在一起(用于作为原始且唯一的ARM ARM,它们被拆分为单独的ARM ARM)。

你正在寻找这样的事情:

if ConditionPassed(cond) then
Rd = (Rm * Rs)[31:0]
if S == 1 then
N Flag = Rd[31]
Z Flag = if Rd == 0 then 1 else 0
C Flag = unaffected in v5 and above, UNPREDICTABLE in v4 and earlier
V Flag = unaffected

for mul or this

Specifying R15 for register <Rd>, <Rm>, or <Rs> has UNPREDICTABLE results.

或者

Operand restriction: Specifying the same register for <Rd> and <Rm> was previously described as producing UNPREDICTABLE results. There is no restriction in ARMv6, and it is believed all relevant ARMv4 and ARMv5 implementations do not require this restriction either, because high performance multipliers read all their operands prior to writing back any results.

对于ARMv4 / 5手册中的LDR指令:

操作数限制 如果指定基址寄存器回写,并且为和指定了相同的寄存器,则结果是不可预测的。

我认为这意味着这个指令

ldr r0,[r0,#+/-offset_12]!

当您告诉指令将负载值和计算的地址保存到r0时,不可预测,只有一个可以获胜,听起来像是一个折腾。没有!最后写入r0的唯一内容是加载的值。并且没有关于限制的评论(在原始ARM ARM的rev I中,回到说ARM ARM和E的rev B和C这些是印刷版本,在这方面彼此之间各不相同,这就是为什么我认为arm使用术语“相关”)。为此,我在上面切割并粘贴。

拇指说明不对限制或不可预测的行为发表评论。

现在,如果您在使用ARM7标记时使用ARMv7,请查看其中一个ARMv7手册

来自ARMv7-AR手册的ARMv7的

同样的问题:

LDR<c> <Rt>, [<Rn>, #+/-<imm12>]!
if wback && n == t then UNPREDICTABLE;

除此之外,使用r15对使用该指令没有任何限制。