0

我正在编写一个 RISCV 规范子集的模拟器,打算使用压缩的 ISA 作为我定制的 16 位指令集的基线。但是,riscv32-unknown-elf-as拒绝将 C.SW 和 C.LW 指令与充当立即值的标签组合起来。

我知道 RV-C 只是基本 ISA 的扩展,不适合独立执行,但我想使用riscv32-unknown-elf-asassembler 实用程序作为为我的模拟器/模拟器组装小程序的简单方法。

根据 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 规范,我希望这是有效的程序集。

4

1 回答 1

1

汇编器无法知道您可能在 中具有什么值x13,因此无法猜测my_label需要具有什么偏移量。这些指令的立即数非常小,以至于您想使用相对值而不是绝对地址。

但是,如果您使用基于目标的形式,并且在使用它们之前定义它们,那么汇编器将接受紧凑指令并计算正确的偏移量/立即数。

尝试这个:

my_label = 64

main:
    .option rvc
    c.sw x12, my_label(x13)

这是一个更大的有效标签示例:

label =  32
    .data
lab1:
    .word 0
lab2:
    .word 1
lab3 = lab2 - lab1
    .text
lab5:
    .word 0
lab6:
    .word 2
lab4 = lab6-lab5
main:
    .option rvc
    c.sw x12,64(x14)
    c.sw x12,label(x13)
    c.sw x12,lab3(x12)
    c.sw x12,lab4(x11)

唯一的限制似乎是汇编器希望看到这些短距离标签在使用之前定义。

因为这些紧凑的指令具有如此短的偏移量(范围),所以上面用相等和减法定义的标签可能是最有用的。(在示例中,我们假设 lab1 的地址在 x12 中,lab5 在 x11 中..)

于 2019-09-13T15:14:29.560 回答