0

我对 ARM 程序集非常陌生,我想了解当您使用STUR. 举个例子,这里是 64 位

0000 0000 0000 0000 0000
0000 0000 0000 0000 0000
0000 0000 0000 0000 0000
0000 

现在当我打电话

STUR X0, [X29,#var_8] ; Store the value of X0 (0xB) into the stack at offset 0x8

会变成吗?

0000 0000 1011 0000 0000
0000 0000 0000 0000 0000
0000 0000 0000 0000 0000
0000 

或者

0000 0000 0000 0000 0000
0000 0000 0000 0000 0000
0000 0000 0000 1011 0000
0000
4

1 回答 1

2

内存是字节可寻址的。因此,描述内存的最佳方式是用地址标记并显示字节值。通常这是用十六进制完成的,但我想二进制也可以。

 Address  Value
10010000   00
10010001   44
10010002   33
10010003   55
...

有时在一行上显示多个字节,只有一个地址号:

 Address  Value
10010000   00 44 33 55
10010004   ...
...

地址对于理解内存是如何工作的很重要。



0000 0000 1011 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000

在十六进制和分组为字节是 00 B0 00 00 00 00 00 00 00 00 00 00 00 00 00 00

该值以小端序解释为 64 位数字,为 45056(十进制)。


0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 1011 0000 0000

在十六进制和分组为字节是 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0B 00

上面的值,以小端方式解释为 64 位数字是 2816(十进制)。


因此,您的问题的答案不是,存储的值将是

B0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

因为这是小端的字节序列,其值为 0xB,也就是 0x000000000000000B 在x0.


需要明确的是,ARM 处理器也可以以大端方式运行,但这似乎并不常见。


偏移量非常重要,因为它改变了x0写入值的地址。

偏移量被添加到基址寄存器(此处为 x29)以形成所谓的有效地址,它决定了将写入第一个字节的地址。内存中的多字节项目由字节中的最低地址引用——正是这个地址与内存系统通信(以及指示内存传输大小和方向的控制信号,这里是 16 字节/64 -位并写入内存)。

写入内存的值仍然是 16 个字节,因此 16 个不同的连续地址处的内存字节被更新。字节将根据 little endian 字节顺序以内存顺序出现。

可以使用 16 字节/64 位读取从内存中读取该值,这将在 CPU 寄存器中获得值 0x00..000B。该内存位置的读取不必在偏移量中匹配,只有有效地址需要是相同的位置才能引用相同的项目,并且将生成相同有效地址的任何寻址模式都可以读取该值

例如,如果堆栈指针从将更多的东西压入堆栈移动——堆栈指针在压入时向下移动到更小的值,以容纳额外的项目(已经在堆栈上的东西在地址方面保持在它们所在的位置)——然后当使用堆栈指针作为基址时,偏移量需要增加以引用与在其他项目被压入堆栈之前写入相同的有效地址;增加的数量需要与推送的项目大小完全匹配,以保持有效地址相同。

于 2021-12-14T20:46:34.663 回答