如果您使用的是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处理这种情况,或者如果它不能处理这种情况,它将发出一个错误,或者在最坏的情况下,生成的代码将是不正确的。
2条答案
按热度按时间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处理这种情况,或者如果它不能处理这种情况,它将发出一个错误,或者在最坏的情况下,生成的代码将是不正确的。5ktev3wc2#
我在一个稍微不同的环境中遇到了同样的问题。我用-march= rv 64 gc编译,即包括压缩指令。但是问题出在objdump而不是gcc。如果我做了以下操作:
我得到了32位和64位指令以及一些伪指令,但没有压缩指令。线程 * Understanding RiscV objdump * 给出了答案。如果我得到了:
我得到了32,64和16位(即压缩)指令,但没有伪指令。
恕我直言,这是非常误导人的。别名或伪指令的目标代码与底层的真实的指令相同,例如
blez
和bge
。但是用32位等效指令替换16位指令是非常不同的。当然,芯片内部可能会将16位指令扩展为32位等效指令,但从内存中检索的位模式将是不同的,并且长度只有原来的一半。我认为这种行为不应该是默认的。