risc-v 中的 lui 与小立即数

Yeq*_*han 1 assembly 32-bit riscv

对于像 这样的 risc-v 指令lui x28 123,venus 显示它的机器代码是0x0007BE37。但是lui应该只加载20immediate 的高位123。由于在十六进制1230x0000007B,我认为相应的机器代码应该是0x00000E37.

我很困惑为什么金星会产生不同的结果,我对 的理解有问题lui吗?

Eri*_*idt 8

当您将数值作为文字提供给类似 的指令时LUI,某些汇编程序会将其作为您希望在指令中编码的确切立即数。这对于生成汇编的编译器或汇编程序员来说非常重要且有用,他们希望LUI在该指令中使用和指定 20 位的确切位模式,而不受汇编程序的任何干扰。

如果您希望它仅采用文字的高 20 位,则有1 之类的编译时函数%hi%lo并且某些汇编器会接受,例如lui %hi(123)- %hiis for use inlui%lofor use in a指令需要低 12 位,例如addisw/ lw

1  这些可能会在链接时间之后进行评估。


这些功能,( &%hi%lo是复杂的,由于与指令等配对的传统选择lwaddi,其中他们立即组成了12位的其余部分,但其本身签署。因此,%hi在特定情况下,该函数lw会将值偏移 1,其中的偏移量将显示为负数,并且在运行时将用 1 符号扩展。因此,当它们配对2 时,环境使事情起作用,但是如果您要%hi()LUI没有这种配对的情况下使用随机常量,则可能无法获得您期望的确切 20 位。

2  多于一个%lo罐〜对具有相同的%hi,只要该函数的参数相匹配。因此,例如,对全局变量的读/修改/写序列可能lui %hi()lw %lo()和都有一个sw %lo()