【问题标题】:Order of register stores in STPSTP 中的寄存器存储顺序
【发布时间】:2019-07-22 21:25:26
【问题描述】:

在 AArch64 汇编中,以下行

stp x25, x30, [sp,#48]

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

【问题讨论】:

  • 首先在较低地址注册,是的,我想是的。 AArch64 ISA 手册应该说。
  • 虽然有趣的是,如果这两个商店作为一个商店出现或具有相对于彼此的定义的顺序。

标签: assembly arm arm64


【解决方案1】:

是的。来自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];

【讨论】:

    猜你喜欢
    • 2011-04-18
    • 2011-05-29
    • 1970-01-01
    • 1970-01-01
    • 2013-10-22
    • 2015-01-12
    • 1970-01-01
    相关资源
    最近更新 更多