繁体   English   中英

RiscV 汇编程序 - 试验 RV32I 的“slli”命令

[英]RiscV assembler - experimenting with the 'slli' command for RV32I

我一直在使用 RV32I 和 RV64I 汇编器在 RiscV 上测试以下代码。

汇编源文件是

.text
slli   x31,x31,63

当我为 32 位目标组装时,我获得以下机器代码输出。

 03ff9f93                slli    x31,x31,0x3f

抛出警告,但指令字的高 7 位似乎没有“保留”。 做一个快速手工组装我希望01ff9f93 我意识到使用 63 的立即操作数值是不正确的,但汇编程序无论如何都会写入 63 值。 这似乎不是正确的操作。

避免这种潜在问题的一种方法是设置--fatal-warnings的汇编命令行选项。 并且构建过程将停止。 但是在-warn级别,似乎可以覆盖 'slli' 命令的 32 个目标的高 7 位,并且您可以创建合法的 RV64I 指令。

为了使此测试的构建简单,我执行了以下操作。

  1. 创建的源文件 - “test.s”
  2. 将源文件复制到 RiscV 32 位构建的 bin 目录。 然后,

    ./riscv32-unknown-elf-as -L --fatal-warnings test.s

或者

 ./riscv32-unknown-elf-as -L -warn test.s
  1. 创建列表文件

    ./riscv32-unknown-elf-objdump -h -l -M 数字,无别名 -S -d -EL a.out

如果在汇编程序中设置 -warn 级别,输出的较低行将如下所示。

Disassembly of section .text:

00000000 <.text>:
   0:   03ff9f93                slli    x31,x31,0x3f

我想知道为什么汇编程序采用这种方法,RV32I 的“slii”的高 7 位不应该总是停留在 0?

这个问题被认为是一个错误,汇编代码已被更改和合并。 您可以在 riscv-next 分支上的 GitHub riscv/riscv-binutils-gdb 上查看详细信息。 在“gas”(汇编程序)中,严重性级别从“warn”更改为“error”——防止创建任何非法的 RV32I 机器代码(03ff9f93 不是 RV32I 上 slli 命令的合法机器代码)。

对于 osgx - 我仍然对您的评论很感兴趣,即没有单独的 32/64 位编码器。 你能澄清一下吗?

只是一个简短的评论:

我可以从 RV32I 的第 130 页和 RV64I 的第 131 页的规范(版本 20190608-Base-Ratified )中看到,SLLI 指令的编码应该有所不同。

RV32I 的移位量限制为 5 位,而 RV64I 则扩展到 6 位。 因此,根据所使用的汇编程序,产生的二进制文件和显示的警告或错误应该有所不同。

问候约阿希姆

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM