Assembly 压缩的C.LW和C.SW指令是否无法使用标签?

Assembly 压缩的C.LW和C.SW指令是否无法使用标签?,assembly,riscv,riscv32,Assembly,Riscv,Riscv32,我正在编写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字节对齐 因此,r

我正在编写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.swx12,64(x13)

人们可能会认为,如果一个标签正确对齐了4字节,表示地址0x64,那么您就可以编写等效的程序集:

C.swx12,我的标签(x13)

但是,
riscv32未知elf as
拒绝组装此行,声明:

test_asm.S: Assembler messages:
test_asm.S:4: Error: illegal operands `c.sw x12,my_label(x13)'
我尝试了这种语法的多种组合,以及各种对齐指令w.r.t.标签。作为参考,这是程序集文件本身:

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

my_label:
    .word 1

是否需要添加其他编译器指令?根据ISA规范,我希望这是有效的汇编。

汇编程序无法知道您在
x13
中可能具有的值,因此无法猜测我的标签需要具有的偏移量。这些指令的指令量非常小,因此您希望使用相对值而不是绝对地址

但是,如果您使用表单target base,并且在使用之前定义它们,那么汇编器将接受压缩指令并计算适当的偏移量/立即数

试试这个:

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)
唯一的限制似乎是汇编器希望在使用这些短距离标签之前看到它们的定义


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

嗯,标签表示地址,通常是32位或64位,这取决于您的平台。因此,直接的假设是,无法强制汇编程序放置标签(我想我们可以称之为“数据段”)是否足够接近代码,短的立即偏移量可以适合标签,并为我们静态地执行这种算法?这在真实的代码中肯定不起作用,但对于我的小用例来说,也许?不知道你在问什么。我的示例包括代码中的数据。我猜您希望在(短位移)pc相对寻址模式下使用它,尽管正如我回答的那样,如果数据位于代码之前,并且您正确定义了标签,那么它可能会起作用。尽管RISC V瞄准的嵌入式系统可能不会混合(只读)代码和可变数据(但谁知道呢)。