ldr r0,[r0]
在 ARM 汇编中这样做是否合法?
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.
它并没有说目标寄存器不能与基址寄存器相同。即,答案是肯定的,它们可以相同。
从 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
对于 mul 或这个
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 使用术语“相关”)。对于我在上面剪切和粘贴的 mul。
拇指指令不对限制或不可预测的行为发表评论。
现在,如果您在用 ARM7 标记此内容时指的是 ARMv7,请查看 ARMv7 手册之一
对于 ARMv7-AR 手册中的 ARMv7 相同的问题:
LDR<c> <Rt>, [<Rn>, #+/-<imm12>]!
if wback && n == t then UNPREDICTABLE;
除此和使用 r15 之外,以这种方式使用指令没有任何限制。