我一直在用RiscV和RV64I汇编程序在RV32I上测试以下代码。
程序集源文件是
.text
slli x31,x31,63当我为32位目标组装时,我获得了以下机器代码输出。
03ff9f93 slli x31,x31,0x3f会抛出一个警告,但它显示指令字的上7位没有“保留”。做一个快速的手工组装,我希望01ff9f93。我意识到使用直接操作数63是不正确的,但是汇编程序无论如何都会写63值。这似乎不是正确的操作。
避免这个潜在问题的一种方法是设置--fatal-warnings的汇编程序命令行选项。构建过程就会停止。但在-warn级别上,“slli”命令的32个目标的7个上位似乎可以被覆盖,您可以创建一个合法的RV64I指令。
为了使此测试的构建保持简单,我执行了以下操作。
./riscv32-unknown-elf-as -L --fatal-warnings test.s或
./riscv32-unknown-elf-as -L -warn test.s如果在汇编程序中设置-warn级别,则输出的较低行如下所示。
Disassembly of section .text:
00000000 <.text>:
0: 03ff9f93 slli x31,x31,0x3f我想知道为什么汇编程序采用这种方法,而RV32I的“slii”的上7位不应该总是卡在0吗?
发布于 2017-05-12 14:34:01
这个问题被认为是一个错误,汇编程序代码已被更改和合并。您可以在GitHub riscv/riscv-binutils-gdb上看到关于riscv下一个分支的详细信息。在“gas”(汇编程序)中,严重性级别从“警告”更改为“错误”--防止创建任何非法的RV32I机器代码(03ff9f93不是RV32I上的slli命令的合法机器代码)。
对于osgx -我仍然对你的评论感兴趣,没有单独的32/64位编码器。你能澄清一下吗?
发布于 2019-11-15 06:32:04
只是一个简短的评论:
我可以从RV32I的130页和RV64I的131页上的规范(20190608版本-基本批准)中看出,SLLI指令的编码应该是不同的。
移位量的RV32I被限制在5位,而对于RV64I,这被扩展到6位。因此,根据所使用的汇编程序,所产生的二进制文件和显示的警告或错误应该存在差异。
约阿希姆问候
https://stackoverflow.com/questions/43858314
复制相似问题