Assembly STP中寄存器存储的顺序

Assembly STP中寄存器存储的顺序,assembly,arm,arm64,Assembly,Arm,Arm64,在AArch64组件中,以下行 stp x25, x30, [sp,#48] 将x25存储在sp+48,将x30存储在sp+56,对吗?是。摘自第C6-1237页及以下内容: 符号偏移量 […] 64位变体 当opc==10时适用 将其插入操作伪代码,用变量替换它们的值,可以有效地得到: CheckSPAlignment(); Mem[SP[] + 48, 8, AccType_NORMAL] = X[25]; Mem[SP[] + 56, 8, AccType_NORMAL] = X[3

在AArch64组件中,以下行

stp x25, x30, [sp,#48]
将x25存储在sp+48,将x30存储在sp+56,对吗?

是。摘自第C6-1237页及以下内容:

符号偏移量 […]

64位变体

opc==10
时适用

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

CheckSPAlignment();
Mem[SP[] + 48, 8, AccType_NORMAL] = X[25];
Mem[SP[] + 56, 8, AccType_NORMAL] = X[30];
对。摘自第C6-1237页及以下内容:

符号偏移量 […]

64位变体

opc==10
时适用

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

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

首先在较低的地址注册,是的,我想是的。AArch64 ISA手册应该这样说。虽然如果两个存储看起来是一个,或者有一个定义的相对顺序,这很有趣。首先在较低的地址注册,是的,我认为是这样。AArch64 ISA手册应该这样说。不过,如果两个存储区显示为一个,或者有一个定义的相对顺序,这是很有趣的。 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;
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];