[英]lui in risc-v with small immediate
对于像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这些可能会在链接时进行评估。
由于传统选择与lw
和addi
等指令配对,这些函数( %hi
和%lo
)很复杂,其中它们的立即数构成 12 位 rest,但本身是有符号的。 因此, %hi
function 在特定情况下将值偏移 1,其中lw
的偏移量将显示为负数,并且在运行时将符号扩展为 1。 因此,当它们配对2时,环境会使事情正常进行,但是如果您在没有这种配对的情况下在随机常数上使用LUI
中的%hi()
,您可能无法获得您期望的确切 20 位。
2只要 function arguments 匹配,多个%lo
可以与相同的%hi
配对。 因此,例如,对全局变量的读/修改/写序列可能对lw %lo()
和sw %lo()
都有一个lui %hi()
) 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.