Sev*_*yev 0 assembly arm arm64
在AArch64程序集中,以下行
stp x25, x30, [sp,#48]
Run Code Online (Sandbox Code Playgroud)
将x25存储在sp + 48,将x30存储在sp + 56,对吗?
是。在本手册的 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)