assembly 如何汇编RVC(压缩指令)扩展的RISC-V指令集?

vbopmzt1  于 2022-11-13  发布在  其他
关注(0)|答案(2)|浏览(255)

我在汇编代码中使用了RVC指令,例如:
c.j 24
当我试图汇编它时,我得到了32位的机器码,但我希望得到16位的,因为它是压缩指令。在二进制文件中,指令用32位表示,汇编指令的操作码对应于普通的RV32I指令JAL,而不是C.JAL的操作码,它是16位宽。我这样编译它:riscv64-unknown-linux-gnu-gcc -c -mabi=ilp32 -march=rv32imac input.s -o output
有人知道怎么解决这个问题吗?

bfnvny8b

bfnvny8b1#

如果您使用的是https://github.com/riscv/riscv-gnu-toolchain的riscv工具链,则通常会得到32位版本。在binutils中,您可以在汇编程序移植tc-riscv.c中看到,如果汇编程序Expand the RVC branch into a RISC-V one.无法验证,则会考虑范围。
当你使用c.j 24时,汇编器不知道代码将被放在哪里,并将其转换为j。这是一个安全的方法,否则,如果发出了一个压缩指令,链接器将不得不用relax处理这种情况,或者如果它不能处理这种情况,它将发出一个错误,或者在最坏的情况下,生成的代码将是不正确的。

5ktev3wc

5ktev3wc2#

我在一个稍微不同的环境中遇到了同样的问题。我用-march= rv 64 gc编译,即包括压缩指令。但是问题出在objdump而不是gcc。如果我做了以下操作:

$ riscv64-unknown-elf-objdump -d myexecutable > myassembly.txt

我得到了32位和64位指令以及一些伪指令,但没有压缩指令。线程 * Understanding RiscV objdump * 给出了答案。如果我得到了:

$ riscv64-unknown-elf-objdump -d -M no-aliases myexecutable > myassembly.txt

我得到了32,64和16位(即压缩)指令,但没有伪指令。
恕我直言,这是非常误导人的。别名或伪指令的目标代码与底层的真实的指令相同,例如blezbge。但是用32位等效指令替换16位指令是非常不同的。当然,芯片内部可能会将16位指令扩展为32位等效指令,但从内存中检索的位模式将是不同的,并且长度只有原来的一半。我认为这种行为不应该是默认的。

相关问题