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

Assembly ldr中的源寄存器和目标寄存器相同,assembly,arm,Assembly,Arm,在ARM组件中执行ldr r0、[r0]合法吗?是,它将获取r0指向的值,并加载寄存器r0。 当有疑问时,您可以使用模拟器进行测试。我使用GBA emulator,尽管GBA特定,但它是一个很好的ARM仿真器。要了解GBA编程的基础知识以便进行此类测试,请访问教程。该编码对于ARMv4上的ARM和thumb指令集都有效 查看ARM(ARM架构参考手册)(http://infocenter.arm.com)为了你感兴趣的家庭。在本例中,ARM7是ARMv4,它与ARMv5臂集中在一起(以前是原始的

在ARM组件中执行ldr r0、[r0]合法吗?

是,它将获取r0指向的值,并加载寄存器r0。
当有疑问时,您可以使用模拟器进行测试。我使用GBA emulator,尽管GBA特定,但它是一个很好的ARM仿真器。要了解GBA编程的基础知识以便进行此类测试,请访问教程。

该编码对于ARMv4上的ARM和thumb指令集都有效

查看ARM(ARM架构参考手册)(http://infocenter.arm.com)为了你感兴趣的家庭。在本例中,ARM7是ARMv4,它与ARMv5臂集中在一起(以前是原始的也是唯一的臂,它们被拆分为单独的臂)

您正在寻找以下内容:

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
给穆尔还是这个

Specifying R15 for register <Rd>, <Rm>, or <Rs> has UNPREDICTABLE results.
当您告诉指令将加载值和计算出的地址保存到r0时,这是不可预测的,只有一个可以赢,听起来像是一个折腾。没有这个!最后,写入r0的唯一内容是加载的值。并且没有关于限制的评论(在原始ARM的版本I中,回到印刷版的ARM和E的版本B和C,在这方面各不相同,这就是为什么我认为ARM使用术语“相关”)。我在上面剪贴了骡子的照片

thumb指令对限制或不可预测的行为没有任何评论

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

对于ARMv7 AR手册中的ARMv7,同一版本:

LDR<c> <Rt>, [<Rn>, #+/-<imm12>]!
if wback && n == t then UNPREDICTABLE;
LDR,[,#+/-]!
如果wback&&n==t,则不可预测;

除此之外,r15的使用对以这种方式使用说明没有任何限制。

如有疑问,请始终参考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.

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

为什么不试试看呢?早期的arm内核可能有问题,但从arm7(armv4)开始,我在许多不同的内核上使用了该指令,没有问题,arm或thumb模式…您如何了解这些内容,请参阅特定核心的技术参考手册,它将指定这些限制。另外,arm系列(armv7、armv6等)的arm、arm体系结构参考手册也可能会告诉您。@Ademiban我确实试过了,它确实有效。但我想确定的是,并不是所有明显有效的东西都有明确的定义。例如,读写超过缓冲区的结尾可以工作,但这并不意味着它已经定义。模拟器无法知道硬件对这些事情做了什么,所以不要相信他们。无论如何,vba与硬件不匹配,存在足够的差异。指令集将允许您对该指令进行编码,如果这是一个问题,那么是的,它将…@dwelch是的,但不足以防止它们被用于尝试类似问题的小事情。我正在谈论ARM组装测试,不是GBA测试。我不认为有一条指令在VBA中没有正确实现:)明白,VBA与GBA不太兼容,我不知道不兼容是在arm内核还是在外部。因此,这是一个足够公平的声明,它可能不是核心。另一个公平的说法是,如果ARM声明了一些不可预测的东西,那么您需要理解,即使您的代码恰好在真实硬件或模拟器上工作。您不能询问硬件或模拟器是否工作,一个实验不能决定设计的成功。ARM的文档记录得更好,几乎所有其他人都可以使用这些文档。dwelch是完全正确的。仿真器只能证明仿真器的行为。不可预测的指令可能在大多数情况下都有效,当它们失败时,将很难找出或再现问题。ldr r0、[r0]、#4也应该与ldr r0、[r0、#offset]有相同的问题!,但是LDR0,[r0]是可以的。
LDR<c> <Rt>, [<Rn>, #+/-<imm12>]!
if wback && n == t then UNPREDICTABLE;
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.