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