![](/img/trans.png)
[英]Calculate nth Fibonacci number using RISC-V (RV32I) compiler without recursion
[英]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 指令。
为了使此测试的构建简单,我执行了以下操作。
将源文件复制到 RiscV 32 位构建的 bin 目录。 然后,
./riscv32-unknown-elf-as -L --fatal-warnings test.s
或者
./riscv32-unknown-elf-as -L -warn test.s
创建列表文件
./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.