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

6tqwzwtp  于 2023-02-16  发布在  其他
关注(0)|答案(2)|浏览(289)

我有汇编代码,其中我使用了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

有人知道怎么解决吗?

gcmastyq

gcmastyq1#

如果你使用的是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。这是一种安全的方法,否则如果发出了压缩指令,链接器将不得不放松地处理这种情况,或者如果它不能处理这种情况,它将发出一个错误,或者在最坏的情况下,生成的代码将不正确。

wswtfjt7

wswtfjt72#

我在一个稍微不同的环境中遇到了同样的问题。我用-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位等效指令,但是从内存中检索到的位模式将是不同的,并且是一半的长度。我不认为这种行为应该是默认的。

相关问题