assembly arm64“add x1,sp,x2,lsl #1”的编码与xzr不同

qzlgjiam  于 2023-04-30  发布在  其他
关注(0)|答案(1)|浏览(186)

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”!
我是不是看到了错误的指令编码?

yhqotfr8

yhqotfr81#

编码的指令从“ADD(移位寄存器)”(§ C6.2.5)改为“ADD(扩展寄存器)”(§ C6.2.3)如果你在操作数中使用SP。这是必要的,因为只有后者支持在其第一个或第二个操作数中使用SPWSP
我有问题的编码,以区分时,SP和XZR的使用。
说明书上说了两个中的哪一个是用的。如果使用SP,则该字段显示类似<Xn|SP>的内容,文本显示“通用寄存器或堆栈指针”。当使用XZR时,该字段显示类似<Xn>的内容,文本仅显示“通用寄存器”。“你需要知道你正在解码哪个指令,才能知道是解码XZR还是SP。并且注意,有时存在多个指令共享相同助记符。例如,ADD助记符由以下指令共享(忽略可用于同一指令的不同操作数大小):

ADD <Xd|SP>, <Xn|SP>, <R><m>{, <extend> {#<amount>}}
ADD <Xd|SP>, <Xn|SP>, #imm{, <shift>}
ADD <Xd>, <Xn>, <Xm>{, <shift> #<amount>}
ADD <V><d>, <V><n>, <V><m>

相关问题