add x1, sp, x2, lsl #1
指令应该是一个“加法(移位寄存器)”,但我在编码上遇到了问题,无法区分何时使用SP和XZR。我对结果感到惊讶。
这是“ADD(移位寄存器)”的编码:
31:1, 30:0, 29:0, 28:0, 27:1, 26:0, 25:1, 24:1, 23..22:shift, 21:0, 20..16:Rm, 15..10:imm6, 9..5:Rn, 4..0:Rd
如果我汇编add x1, xzr, x2, lsl #1
,它匹配上面的编码。只是为了强调重要的一点:
E1 07 02 8B add x1, xzr, x2, lsl #1
bit 21 = 0;
shift = 0 (lsl);
imm6 = 1
但是如果我汇编add x1, sp, x2, lsl #1
,编码中会有奇怪的变化。这些变化是:
E1 67 22 8B add x1, sp, x2, lsl #1
bit 21 = 1;
shift = 0;
imm6 = 011001 (lsl 25)
所以,我猜第21位是SP而不是XZR。为什么imm 6 = 25?那是“LSL 25”!
我是不是看到了错误的指令编码?
1条答案
按热度按时间yhqotfr81#
编码的指令从“ADD(移位寄存器)”(§ C6.2.5)改为“ADD(扩展寄存器)”(§ C6.2.3)如果你在操作数中使用
SP
。这是必要的,因为只有后者支持在其第一个或第二个操作数中使用SP
或WSP
。我有问题的编码,以区分时,SP和XZR的使用。
说明书上说了两个中的哪一个是用的。如果使用
SP
,则该字段显示类似<Xn|SP>
的内容,文本显示“通用寄存器或堆栈指针”。当使用XZR
时,该字段显示类似<Xn>
的内容,文本仅显示“通用寄存器”。“你需要知道你正在解码哪个指令,才能知道是解码XZR
还是SP
。并且注意,有时存在多个指令共享相同助记符。例如,ADD
助记符由以下指令共享(忽略可用于同一指令的不同操作数大小):