【发布时间】:2020-09-14 09:18:26
【问题描述】:
在 RISC-V 手册中写了这个指令:
C.LUI 将非零 6 位立即数字段加载到目标寄存器的第 17-12 位,清除低 12 位,并将第 17 位符号扩展为目标的所有高位
由此我得出的结论是立即数应该是 6 位,但后来我正在编译一些东西,这行可以编译但立即数超过 6 位宽,所以我很困惑
c.lui x14,0xffff8
【问题讨论】:
-
嗯,它说操作数是符号扩展的,所以也许汇编器接受任何部分符号扩展的变体(例如,除了 0x38 它还接受 0x78、0xF8、0x1F8 等)。
-
检查你从 disassemble 得到的结果。一个好的汇编程序应该警告截断值以适应有限大小的立即数,但可能会默默地截断。另外,通常你给汇编器你真正想要的值,它会处理编码。这在第 12 位下方设置了一些位,所以这很奇怪。
-
@PeterCordes 如果这类似于 MIPS 的
lui,那么您指定您想要的高位值,而不是您想要的整个寄存器的值。 -
@Michael:好点,它可以是一个隐式左移的值,忘记了 LUI 语法是如何工作的。但总的来说,汇编器采用值,而不是原始编码,所以我对“部分符号扩展”值持怀疑态度;那些可能会给出关于截断或不可编码的警告或错误。一般来说,汇编,然后查看机器代码和反汇编是找出 asm 语法中的含义以及找到指令的规范语法的好方法。
标签: assembly compilation riscv instructions