ARM程序集中str的说明

时间:2016-02-10 08:40:01

标签: assembly arm

奇怪的是,我无法找到关于str如何在汇编语言中工作的解释。

我明白以下......

str r1,[r2]

...将寄存器1中的任何内容r1存储在寄存器2的地址r2中。但是,我想解释当方括号更复杂时str如何工作。例如:

str r1,[r0,r3,lsl#2]

这里发生了什么?我想知道r1的价值最终会在哪里,以及它的价值。我无法测试它,因此我将猜测我的想法。

r3在逻辑上移位2.然后将其添加到r0。最后,r1被添加到r0

这是我的猜测,虽然对我来说这听起来不太正确。有人可以为我澄清一下吗?

2 个答案:

答案 0 :(得分:5)

  

str r1,[r0,r3,lsl#2]

     

这里发生了什么?

上面的说明基本上是:r0 + (r3 << 2) = r1,或者如果我们手动“扩展”位移:r0 + (r3 * 4) = r1

符号为<instruction> <src> [<dst>, <offset>, <shift>]

请注意,偏移也可以是负数(例如-r3, #lsl2)。

  

我想知道r1的值最终会在哪里,以及它的价值是什么。

您需要知道r0r3在执行过程中的特定时间点的实际值,然后您才能知道其中的任何内容。这就像问yy = f(x) : x * 2的价值是多少?对x没有任何了解。

  

r3在逻辑上移位2.然后将其添加到r0。

  

最后,r1被添加到r0。

r1中的数据存储(未添加到)由左侧计算的位置。

答案 1 :(得分:2)

  

r3在逻辑上移位2.然后将其加到r0。最后,r1被添加到r0。

r1未添加到任何内容中。它存储在您在前两个句子中描述的地址计算的地址。即:

[r0 + (r3 << 2)] = r1

有关详细信息,请参阅“ARM体系结构参考手册”中的加载和存储字或无符号字节 - 缩放寄存器偏移量

  

我想知道r1的值最终会在哪里,以及它的价值是什么。

如果在句子的第二部分你的意思是“我想知道r1的价值是什么”那么答案是“根据给定的说法不可能说”信息”。它将具有最后分配给它的任何值。