我想不出如何正确地调用这两条指令。第一个指令C.ADDI4SPN
的第一个操作数应该是一个寄存器,而第二个操作数,如果我是对的,应该是一个被缩放为4的数字。
但是当我试图调用指令时,我会得到一个消息,即操作数是非法的。
第二条指令C.ADDI16SP
也是如此,唯一的区别是这个数字应该是16。以下是手册中的说明:
C.ADDI16SP向堆栈指针(sp=x2)中的值添加了非零符号扩展的6位即期(sp=x2),在该值中,直接表示范围内16的倍数(-512,496)。C.ADDI4SPN是一种CIW格式的rv32c/rv64c专用指令,它将零扩展的非零立即(缩放为4 )添加到堆栈指针x2中,并将结果写入rd0。
下面是我尝试使用这些说明的例子:
c.addi16sp 32
c.addi4spn x10, 8
发布于 2020-08-31 16:49:14
似乎出于某种原因,我不知道,在使用以下说明时,我们必须为sp
寄存器命名:
c.addi4sp, x10, sp, 8
c.addi16sp sp, 16
这可能是为了与未压缩的指令扩展保持一致,在该扩展中,您还必须命名为sp
。
然而,尽管有些人可能将此视为一项功能,但其他人(如我)则更有可能将其视为错误或奇数,因为在显式使用压缩操作码时,程序集表单可能不需要隐式寄存器(您永远无法更改)。
从机器代码的角度来看,基本指令集(即sans压缩)没有隐式寄存器,所有操作数都在机器指令中指定。
某些组装助记符允许省略寄存器,然后由汇编程序在生成机器代码时填充寄存器:例如,jal
和ret
(伪指令)不允许或要求组装程序命名寄存器,但是这些指令的机器代码有一个rd
/rs1
寄存器字段(分别由汇编程序填充x1
/ra
)。
为了使用c.lwsp
,我们还指定了sp
寄存器,因此它看起来非常像一个lw
指令。从机器代码的角度来看,c.jal
看起来就像假定x1
为链接寄存器的jal
伪指令--尽管c.jal
将硬代码x1
作为隐式目标寄存器,而jal
的翻译则并非如此。
因此,我猜他们的目标是最大限度地兼容未压缩指令汇编表单。我想这会使反汇编变得更容易接受,因为它无法判断您最初使用的是压缩操作码还是汇编程序压缩指令(虽然我不知道用未压缩但可压缩的形式显示压缩指令的反汇编有多大的价值)。
测试:
.text
c.addi4spn a0, sp, 8 # compressed instruction, must name sp
addi a0, sp, 8 # non-compressed instruction, gets compressed to c.addi4spn
c.addi16sp sp, 16 # compressed instruction, must name sp
addi sp, sp, 16 # non-compressed instruction, gets compressed to c.addi
c.addi16sp sp, 128 # compressed instruction, must name sp
addi sp, sp, 128 # non-compressed instruction, gets compressed to c.addi16sp
Disassembly of section .text:
00000000 <.text>:
0: 0028 addi a0,sp,8 # c.addi4spn
2: 0028 addi a0,sp,8 # c.addi4spn
4: 6141 addi sp,sp,16 # c.addi16sp
6: 0141 addi sp,sp,16 # c.addi
8: 6109 addi sp,sp,128 # c.addi16sp
a: 6109 addi sp,sp,128 # c.addi16sp
如您所见,反汇编程序假设您使用(或希望看到)非压缩指令语法,即使汇编程序可能已经或可能没有将它们转换为它们的压缩等价物。
https://stackoverflow.com/questions/63674523
复制相似问题