我正在编写一个 RISCV 规范子集的模拟器,打算使用压缩的 ISA 作为我定制的 16 位指令集的基线。但是,riscv32-unknown-elf-as
拒绝将 C.SW 和 C.LW 指令与充当立即值的标签组合起来。
我知道 RV-C 只是基本 ISA 的扩展,不适合独立执行,但我想使用riscv32-unknown-elf-as
assembler 实用程序作为为我的模拟器/模拟器组装小程序的简单方法。
根据 RISC-V ISA 规范(截至撰写本文时),C.SW 指令采用 7 位立即数,并且该值左移两次(乘以 4),因为假设加载/存储为无论如何都要4字节对齐。
因此,以下组装被视为合法riscv32-unknown-elf-as
并成功组装:
C.SW x12, 64(x13)
有人会认为,如果标签正确地 4 字节对齐,代表地址 0x64,您将能够编写等效的程序集:
C.SW x12, my_label(x13)
然而,riscv32-unknown-elf-as
拒绝组装这条线,并指出:
test_asm.S: Assembler messages:
test_asm.S:4: Error: illegal operands `c.sw x12,my_label(x13)'
我已经尝试了这种语法的许多组合,以及标签上的各种对齐指令。作为参考,这是程序集文件本身:
main:
.option rvc
c.sw x12, my_label(x13)
my_label:
.word 1
我需要添加额外的编译器指令吗?根据 ISA 规范,我希望这是有效的程序集。