Assembly RISC-V在具有LUI/ADDI的寄存器中生成-1/0xFFFFFFFF?
我正在学习如何为RISC-V处理器编写代码。我想将Assembly RISC-V在具有LUI/ADDI的寄存器中生成-1/0xFFFFFFFF?,assembly,riscv,Assembly,Riscv,我正在学习如何为RISC-V处理器编写代码。我想将0xFFFFFFFF的值存储到内存/寄存器中 我可以通过在addi指令之前添加一个lui来扩展该指令的12个立即位, 大概是这样的: lui t0, 0xFFFFF addi t0, t0, 0x7FF 但结果将类似于0xFFFFF7FF 那么,我怎样才能产生这个价值呢 询问C编译器: unsigned foo(){return 0xFFFFFFFF;} 针对RISC-V,使用叮当声-O3编译到此asm: (gcc只使用LIA0,-1伪指令,
0xFFFFFFFF
的值存储到内存/寄存器中
我可以通过在addi
指令之前添加一个lui
来扩展该指令的12个立即位,
大概是这样的:
lui t0, 0xFFFFF
addi t0, t0, 0x7FF
但结果将类似于0xFFFFF7FF
那么,我怎样才能产生这个价值呢 询问C编译器:
unsigned foo(){return 0xFFFFFFFF;}
针对RISC-V,使用叮当声-O3
编译到此asm:
(gcc只使用LIA0,-1
伪指令,并将详细信息留给汇编程序。通常情况下,您也应该这样做,除非您想选择可以更高效地生成的常量。)
RISC-V
addi
符号将其立即数操作数扩展到32(或64)位,因此,如果您希望在第12位有一个立即数操作数,则需要在选择高位时考虑到这一点
在这种情况下,高位的正确起始值为0
,因此您可以完全优化lui
RISC-V使用2的补码有符号整数,因此符号扩展只意味着在加宽时将符号位复制到所有更高的位置。让我们首先分析代码的问题所在:
lui t0, 0xFFFFF
addi t0, t0, 0x7FF
指令将20位立即数lui
左移12位后产生的值加载到0xFFFFF
中。因此,t0
导致t0
0xFFFFF000
12位立即数addi
,并将其添加到寄存器0x7FF
。由于立即数的最高有效位(即符号位)为零,其符号扩展32位值为t0
。然后将该值添加到以前的0x000007FF
中的0xFFFFF000
。因此,t0
的结果值是t0
0xFFFFF7FF
如中所述,您可以通过利用符号扩展的工作方式来优化
lui
指令:符号扩展传播符号位,符号位是最高有效位
12位立即数0xFFF
由所有1
s组成,包括最高有效位(即符号位)。因此,它的32位符号扩展名是0xFFFFFFFF
,它已经对应于您想要的值:
addi t0, zero, 0xFFF
如果您坚持使用这两个指令,lui
和addi
,只需将所有0
加载到t0
的高位:
lui t0, 0
addi t0, t0, 0xFFF
lui t0, 0
addi t0, t0, 0xFFF