我一直在使用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 numeric,no-aliases -S -d -EL a.out
如果设置,下面的输出行将如下所示 - 汇编程序中的警告级别。
Disassembly of section .text:
00000000 <.text>:
0: 03ff9f93 slli x31,x31,0x3f
我想知道为什么汇编程序采用这种方法,并且不应该将RV32I的'slii'的高7位始终固定在0?
答案 0 :(得分:1)
此问题被视为错误,汇编程序代码已更改并合并。您可以在riscv-next分支上的GitHub riscv / riscv-binutils-gdb中查看详细信息。在'gas'(汇编程序)中,严重性级别从'warn'更改为'error' - 防止创建任何非法的RV32I机器代码(03ff9f93不是RV32I上slli命令的合法机器代码)。
对于osgx - 我仍然对你的评论感兴趣,即没有单独的32/64位编码器。你能澄清一下吗?
答案 1 :(得分:0)
请简短说明:
我从RV32I的第130页和RV64I的第131页的规范(版本20190608-Base-Ratified)中看到,SLLI指令的编码应该有所不同。
用于移位量的RV32I限制为5位,对于RV64I则扩展为6位。因此,根据所使用的汇编器的不同,二进制文件的结果和显示的警告或错误也应该有所不同。
问候约阿希姆