【问题标题】:What are the operands of C.LUI instruction(compressed subset of RISC-V)?C.LUI 指令(RISC-V 的压缩子集)的操作数是什么?
【发布时间】: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


【解决方案1】:

c.lui 将立即接受任何 20 位,只要所有位 5 到 19 具有相同的值(1 或 0)。
所以基本上 c.lui 将接受 0xfffe0 和 0xfffff 之间的任何值以及 1 和 0x1f 之间的任何值。 0x0 也不被接受(见https://riscv.org//wp-content/uploads/2017/05/riscv-spec-v2.2.pdf

用你的例子
c.lui a4, 0xffff8 将给出指令 0x7761 从该指令中提取的立即数为 0x38,如果将其移位 12,您将得到 0x38000,然后当您对其进行签名扩展时,您将得到:0xffff8000

【讨论】:

  • 谢谢,这就是我要找的答案。
猜你喜欢
  • 2023-04-10
  • 2014-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-04
  • 2018-11-22
  • 2023-03-22
  • 1970-01-01
相关资源
最近更新 更多