STP中的寄存器存储顺序

Sev*_*yev 0 assembly arm arm64

在AArch64程序集中,以下行

stp x25, x30, [sp,#48]
Run Code Online (Sandbox Code Playgroud)

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

Sig*_*uza 5

是。在本手册的 C6-1237页及以下内容中:

签名偏移

[...]

64位变体

适用于opc == 10。

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

boolean wback = FALSE;
布尔值postindex = FALSE;
[...]

共享解码所有编码

[...]
整数n = UInt(Rn);
整数t = UInt(Rt);
整数t2 = UInt(Rt2);
[...]
整数比例= 2 + UInt(opc <1>);
整数数据大小= 8 <<比例;
bits(64)offset = LSL(SignExtend(imm7,64),比例);
[...]

所有编码的操作

恒定整数dbytes =数据大小DIV 8;

[...]

如果n == 31则
    CheckSPAlignment();
    地址= SP [];
其他
    地址= X [n];

如果!postindex然后
    地址=地址+偏移量;

[...]
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
Run Code Online (Sandbox Code Playgroud)

将其插入操作伪代码,用变量替换其值,即可有效地获得:

CheckSPAlignment();
Mem[SP[] + 48, 8, AccType_NORMAL] = X[25];
Mem[SP[] + 56, 8, AccType_NORMAL] = X[30];
Run Code Online (Sandbox Code Playgroud)