RiscV汇编程序 - 试验RV32I的{slli'命令

时间:2017-05-08 22:38:49

标签: assembly riscv

我一直在使用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

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

      ./ riscv32-unknown-elf-objdump -h -l -M numeric,no-aliases -S -d -EL a.out

    2. 如果设置,下面的输出行将如下所示 - 汇编程序中的警告级别。

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

      我想知道为什么汇编程序采用这种方法,并且不应该将RV32I的'slii'的高7位始终固定在0?

2 个答案:

答案 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位。因此,根据所使用的汇编器的不同,二进制文件的结果和显示的警告或错误也应该有所不同。

问候约阿希姆