【发布时间】:2019-07-22 21:25:26
【问题描述】:
在 AArch64 汇编中,以下行
stp x25, x30, [sp,#48]
在 sp+48 存储 x25,在 sp+56 存储 x30,对吧?
【问题讨论】:
-
首先在较低地址注册,是的,我想是的。 AArch64 ISA 手册应该说。
-
虽然有趣的是,如果这两个商店作为一个商店出现或具有相对于彼此的定义的顺序。
在 AArch64 汇编中,以下行
stp x25, x30, [sp,#48]
在 sp+48 存储 x25,在 sp+56 存储 x30,对吧?
【问题讨论】:
是的。来自this manual,第 C6-1237 页及以下:
有符号偏移量
[...]
64 位变体
适用于opc == 10。STP解码此编码的所有变体, , [ {, # }] boolean wback = FALSE; boolean postindex = FALSE;[...]所有编码的共享解码
[...] 整数 n = UInt(Rn); 整数 t = UInt(Rt); 整数 t2 = UInt(Rt2); [...] 整数比例 = 2 + UInt(opc); 整数数据大小 = 8 [...]所有编码的操作
常量整数 dbytes = 数据大小 DIV 8; [...] 如果 n == 31 那么 CheckSPAlignment(); 地址 = SP[]; 别的 地址 = X[n]; 如果 !postindex 那么 地址 = 地址 + 偏移量; [...] 数据1 = X[t]; [...] 数据2 = X[t2]; 内存[地址,dbytes,AccType_NORMAL] = data1; Mem[地址+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];
【讨论】: