汇编语言中的 LDR 有不同的形式吗?

LDR in Assembly Language diffrent forms?

我有一个问题要解决,但是我的解决方案都是错误的,所以我决定来这里问一下,看看我的错误在哪里。

LDR r1, [r0, #4]
LDR r2, [r0], #8
LDR r3, [r0]
LDR r4, [r0, #4]!

这些都是内存中定义的变量

Memory
Address Content
0x100   0x02
0x104   0x05 
0x108   0x0A
0x10C   0x10

这是我们需要写入最后一个值的主要问题。

Register    Initial Value   Last Value
r0          0x100           ?
r1          0x000           ?
r2          0x000           ?
r3          0x000           ?
r4          0x000           ?

通过我的计算,我能够正确找到 r1,但在那之后我 fail.For 例如,r2 出现 0x05,最后 r0 出现 0x10C 这怎么可能,这里没有代码将 r0 保存到内存中,为什么它 changes.I 猜想我不知道如何处理 r2 并且 r4.Anyone 了解有关 ARM 帮助的知识将非常有用。

谢谢。

指令:

LDR rX, [rY, #Z]!

大致等于:

ADD rY, #Z
LDR rX, [rY]

LDR rX, [rY], #Z

大致等于:

LDR rX, [rY]
ADD rY, #Z

替换您的代码的说明如下所示:

LDR r1, [r0, #4]   ; Load memory content of 0x104 to r1
LDR r2, [r0]       ; Load memory content of 0x100 to r2
ADD r0, #8         ; Now R0 is 0x108
LDR r3, [r0]       ; Load memory content of 0x108 to r3
ADD r0, #4         ; Now R0 is 0x10C
LDR r4, [r0, #4]   ; Load memory content of 0x10C to r4

这意味着寄存器必须在之后具有以下值:

R0 = 0x10C
R1 = 5
R2 = 2
R3 = 0xA
R4 = 0x10

我使用 Arcorn Archimedes 模拟器尝试了这个程序,我得到了这些结果。