在AArch64汇编中,以下行代码的意思是"最初的回答"。
stp x25, x30, [sp,#48]
存储 x25 到 sp+48,存储 x30 到 sp+56,对吗?
最初的回答带符号偏移量
[...]
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];