首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用RISC体系结构的C.ADDI4SPN和C.ADDI16SP指令(压缩子集)?

如何使用RISC体系结构的C.ADDI4SPN和C.ADDI16SP指令(压缩子集)?
EN

Stack Overflow用户
提问于 2020-08-31 16:21:05
回答 3查看 889关注 0票数 1

我想不出如何正确地调用这两条指令。第一个指令C.ADDI4SPN的第一个操作数应该是一个寄存器,而第二个操作数,如果我是对的,应该是一个被缩放为4的数字。

但是当我试图调用指令时,我会得到一个消息,即操作数是非法的。

第二条指令C.ADDI16SP也是如此,唯一的区别是这个数字应该是16。以下是手册中的说明:

C.ADDI16SP向堆栈指针(sp=x2)中的值添加了非零符号扩展的6位即期(sp=x2),在该值中,直接表示范围内16的倍数(-512,496)。C.ADDI4SPN是一种CIW格式的rv32c/rv64c专用指令,它将零扩展的非零立即(缩放为4 )添加到堆栈指针x2中,并将结果写入rd0。

下面是我尝试使用这些说明的例子:

代码语言:javascript
运行
复制
c.addi16sp 32
c.addi4spn x10, 8
EN

Stack Overflow用户

回答已采纳

发布于 2020-08-31 16:49:14

似乎出于某种原因,我不知道,在使用以下说明时,我们必须为sp寄存器命名:

代码语言:javascript
运行
复制
c.addi4sp, x10, sp, 8
c.addi16sp sp, 16

这可能是为了与未压缩的指令扩展保持一致,在该扩展中,您还必须命名为sp

然而,尽管有些人可能将此视为一项功能,但其他人(如我)则更有可能将其视为错误或奇数,因为在显式使用压缩操作码时,程序集表单可能不需要隐式寄存器(您永远无法更改)。

从机器代码的角度来看,基本指令集(即sans压缩)没有隐式寄存器,所有操作数都在机器指令中指定。

某些组装助记符允许省略寄存器,然后由汇编程序在生成机器代码时填充寄存器:例如,jalret (伪指令)不允许或要求组装程序命名寄存器,但是这些指令的机器代码有一个rd/rs1寄存器字段(分别由汇编程序填充x1/ra )。

为了使用c.lwsp,我们还指定了sp寄存器,因此它看起来非常像一个lw指令。从机器代码的角度来看,c.jal看起来就像假定x1为链接寄存器的jal伪指令--尽管c.jal将硬代码x1作为隐式目标寄存器,而jal的翻译则并非如此。

因此,我猜他们的目标是最大限度地兼容未压缩指令汇编表单。我想这会使反汇编变得更容易接受,因为它无法判断您最初使用的是压缩操作码还是汇编程序压缩指令(虽然我不知道用未压缩但可压缩的形式显示压缩指令的反汇编有多大的价值)。

测试:

代码语言:javascript
运行
复制
.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

代码语言:javascript
运行
复制
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

如您所见,反汇编程序假设您使用(或希望看到)非压缩指令语法,即使汇编程序可能已经或可能没有将它们转换为它们的压缩等价物。

票数 3
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63674523

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档