我有一个问题要解决,但我的解决方案都出错了,所以我决定来这里问一下,看看我的错误在哪里。
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但之后我失败了。例如r2出来了0x05而最后r0出来0x10C怎么可能这样,这里没有代码来保存r0为了记忆它为什么会改变。我想我不知道如何处理r2和r4.Anyone对ARM的帮助知识非常好。
感谢。
答案 0 :(得分:1)
指示:
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仿真器尝试了该程序,我得到了这些结果。