ARM程序集中的偏移量是从开始算还是从结束算



我对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

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

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

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

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

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



0000 0000 1011 00000000 0000 0000 00000000 0000 0000 00000000

以十六进制表示并分组为字节的是00 B0 00 00 00 00 000 00 00 00

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


0000 0000 0000 00000000 0000 0000 00000000 0000 1011 00000000

以十六进制表示并分组为字节的是00 00 00 00 000 00 00 00 0 00 00 00 0B 00

上面的值,用小端序解释为64位数字,是2816(十进制(。


所以,你的问题的答案是两者都不是,存储的值将是

B0 00 00 00 00

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


需要明确的是,ARM处理器也可以作为big-endian运行,但这似乎并不常见。


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

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

写入存储器的值仍然是16个字节,因此在16个不同的连续地址处的存储器字节被更新。字节将按照小端字节顺序以内存顺序出现。

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

例如,如果堆栈指针从将更多的东西推到堆栈上开始移动——推时堆栈指针向下移动到较小的值,以容纳额外的项目(堆栈上已经存在的东西在地址方面保持不变(——那么当使用堆栈指针作为基时,偏移量将需要增加以引用在将附加项推送到堆栈上之前写入的相同有效地址;增加的数量需要与推送的项目的大小完全匹配,以保持有效地址不变。

最新更新