Yeq*_*han 1 assembly 32-bit riscv
对于像 这样的 risc-v 指令lui x28 123,venus 显示它的机器代码是0x0007BE37。但是lui应该只加载20immediate 的高位123。由于在十六进制123中0x0000007B,我认为相应的机器代码应该是0x00000E37.
我很困惑为什么金星会产生不同的结果,我对 的理解有问题lui吗?
当您将数值作为文字提供给类似 的指令时LUI,某些汇编程序会将其作为您希望在指令中编码的确切立即数。这对于生成汇编的编译器或汇编程序员来说非常重要且有用,他们希望LUI在该指令中使用和指定 20 位的确切位模式,而不受汇编程序的任何干扰。
如果您希望它仅采用文字的高 20 位,则有1 之类的编译时函数%hi,%lo并且某些汇编器会接受,例如lui %hi(123)- %hiis for use inlui和%lofor use in a指令需要低 12 位,例如addi和sw/ lw。
1 这些可能会在链接时间之后进行评估。
这些功能,( &%hi)%lo是复杂的,由于与指令等配对的传统选择lw和addi,其中他们立即组成了12位的其余部分,但其本身签署。因此,%hi在特定情况下,该函数lw会将值偏移 1,其中的偏移量将显示为负数,并且在运行时将用 1 符号扩展。因此,当它们配对2 时,环境使事情起作用,但是如果您要%hi()在LUI没有这种配对的情况下使用随机常量,则可能无法获得您期望的确切 20 位。
2 多于一个%lo罐〜对具有相同的%hi,只要该函数的参数相匹配。因此,例如,对全局变量的读/修改/写序列可能lui %hi()对lw %lo()和都有一个sw %lo()。