【发布时间】:2021-06-17 23:24:46
【问题描述】:
对于像lui x28 123 这样的risc-v 指令,venus 显示它的机器码是0x0007BE37。
但是lui 应该只加载立即123 的高位20。由于在十六进制中123 是0x0000007B,我认为对应的机器码应该是0x00000E37。
我很疑惑为什么venus会产生不同的结果,是不是我对lui的理解有问题?
【问题讨论】:
对于像lui x28 123 这样的risc-v 指令,venus 显示它的机器码是0x0007BE37。
但是lui 应该只加载立即123 的高位20。由于在十六进制中123 是0x0000007B,我认为对应的机器码应该是0x00000E37。
我很疑惑为什么venus会产生不同的结果,是不是我对lui的理解有问题?
【问题讨论】:
当您将数值作为文字提供给LUI 之类的指令时,一些汇编程序会将其作为您希望在指令中编码的精确 立即值。这对于生成汇编的编译器或想要使用LUI 并为该指令中的 20 位指定确切位模式而不受汇编器任何干扰的汇编程序员来说非常重要和有用。
如果您希望它只占用文字的高 20 位,则有一些编译器会接受的编译时函数1,例如 %hi 和 %lo,例如lui %hi(123) — %hi 用于 lui 和 %lo 用于需要 12 个低位的指令,例如 addi 和 sw/lw。
1 这些可能会在链接时被评估。
这些函数 (%hi & %lo) 很复杂,因为传统选择与 lw 和 addi 等指令配对,其中它们的立即数构成 12 位余数,但是本身已签名。因此,%hi 函数将值偏移 1 在特定情况下,lw 的偏移量将显示为负数,并将在运行时用 1 符号扩展。因此,当它们配对2时,环境使事情正常进行,但是如果您在没有这种配对的情况下在随机常数上使用 %hi() 和 LUI,您可能无法获得准确的 20 位'期待。
2 只要函数参数匹配,多个%lo 可以与相同的%hi 配对。因此,例如,对全局变量的读/修改/写序列可能对lw %lo() 和sw %lo() 都有一个lui %hi()。
【讨论】: