汇编语言中的 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 模拟器尝试了这个程序,我得到了这些结果。
我有一个问题要解决,但是我的解决方案都是错误的,所以我决定来这里问一下,看看我的错误在哪里。
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 模拟器尝试了这个程序,我得到了这些结果。