STP中寄存器存储的顺序是什么?

3
在AArch64汇编中,以下行代码的意思是"最初的回答"。
stp x25, x30, [sp,#48]

存储 x25 到 sp+48,存储 x30 到 sp+56,对吗?

最初的回答

首先在较低的地址上进行注册,是的,我认为应该这样。一个 AArch64 ISA 手册应该可以说明。 - Peter Cordes
虽然如果这两个存储区域出现为一个或相对于彼此有定义的排序是很有趣的。 - fuz
1个回答

6
是的。从这个手册,第C6-1237页及其后面:

带符号偏移量

[...]

64位变体

opc == 10 时应用。

STP <Xt1>, <Xt2>, [<Xn|SP>{, #<imm>}]
对于此编码的所有变体进行解码

boolean wback = FALSE;
boolean postindex = FALSE;
[...]

共享解码所有编码

[...]
integer n = UInt(Rn);
integer t = UInt(Rt);
integer t2 = UInt(Rt2);
[...]
integer scale = 2 + UInt(opc<1>);
integer datasize = 8 << scale;
bits(64) offset = LSL(SignExtend(imm7, 64), scale);
[...]

所有编码的操作

constant integer dbytes = datasize DIV 8;
[...]
if n == 31 then CheckSPAlignment(); address = SP[]; else address = X[n];
if !postindex then address = address + offset;
[...] data1 = X[t]; [...] data2 = X[t2];
Mem[address, dbytes, AccType_NORMAL] = data1; Mem[address+dbytes, dbytes, AccType_NORMAL] = data2;


让我们从头到尾地一起看看。您的 stp x25,x30,[sp,#48] 是一个64位带符号偏移量的 stp,它的解码方式如下:

n = 31
t = 25
t2 = 30
scale = 3 // since opc = 0b10
datasize = 64
offset = 48

将其插入操作伪代码中,用变量代替它们的值,您将有效地得到:

CheckSPAlignment();
Mem[SP[] + 48, 8, AccType_NORMAL] = X[25];
Mem[SP[] + 56, 8, AccType_NORMAL] = X[30];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接