压缩后的C.LW和C.SW指令是否不能使用标签?
Are the compressed C.LW and C.SW instructions unable to use labels?
我正在编写一个 RISCV 规范子集的仿真器,打算使用压缩的 ISA 作为我定制的 16 位指令集的基线。但是,riscv32-unknown-elf-as
拒绝 assemble C.SW 和 C.LW 带有标签作为立即值的指令。
我知道 RV-C 只是基础 ISA 的扩展,不适合独立执行,但我想使用 riscv32-unknown-elf-as
assembler 实用程序作为一个简单的工具我的 simulator/emulator.
assemble 小程序的方法
根据 RISC-V ISA 规范(截至撰写本文时),C.SW 指令采用 7 位立即数,并将该值左移两次(乘以 4)如下loads/stores 无论如何都假定为 4 字节对齐。
因此,riscv32-unknown-elf-as
认为以下程序集合法并成功 assembles:
C.SW x12, 64(x13)
有人会认为,如果标签正确对齐 4 字节,代表地址 0x64,您将能够编写等效的程序集:
C.SW x12, my_label(x13)
但是,riscv32-unknown-elf-as
拒绝 assemble 这一行,声明:
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
中可能有什么值,因此无法猜测 my_label
需要的偏移量。这些指令的立即数非常小,以至于您想使用相对值而不是绝对地址。
不过,如果您使用 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 中。)
我正在编写一个 RISCV 规范子集的仿真器,打算使用压缩的 ISA 作为我定制的 16 位指令集的基线。但是,riscv32-unknown-elf-as
拒绝 assemble C.SW 和 C.LW 带有标签作为立即值的指令。
我知道 RV-C 只是基础 ISA 的扩展,不适合独立执行,但我想使用 riscv32-unknown-elf-as
assembler 实用程序作为一个简单的工具我的 simulator/emulator.
根据 RISC-V ISA 规范(截至撰写本文时),C.SW 指令采用 7 位立即数,并将该值左移两次(乘以 4)如下loads/stores 无论如何都假定为 4 字节对齐。
因此,riscv32-unknown-elf-as
认为以下程序集合法并成功 assembles:
C.SW x12, 64(x13)
有人会认为,如果标签正确对齐 4 字节,代表地址 0x64,您将能够编写等效的程序集:
C.SW x12, my_label(x13)
但是,riscv32-unknown-elf-as
拒绝 assemble 这一行,声明:
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
中可能有什么值,因此无法猜测 my_label
需要的偏移量。这些指令的立即数非常小,以至于您想使用相对值而不是绝对地址。
不过,如果您使用 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 中。)