Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly RISC-V在具有LUI/ADDI的寄存器中生成-1/0xFFFFFFFF?_Assembly_Riscv - Fatal编程技术网

Assembly RISC-V在具有LUI/ADDI的寄存器中生成-1/0xFFFFFFFF?

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伪指令,

我正在学习如何为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
伪指令,并将详细信息留给汇编程序。通常情况下,您也应该这样做,除非您想选择可以更高效地生成的常量。)


RISC-V
addi
符号将其立即数操作数扩展到32(或64)位
,因此,如果您希望在第12位有一个立即数操作数,则需要在选择高位时考虑到这一点

在这种情况下,高位的正确起始值为
0
,因此您可以完全优化
lui


RISC-V使用2的补码有符号整数,因此符号扩展只意味着在加宽时将符号位复制到所有更高的位置。

让我们首先分析代码的问题所在:

lui t0, 0xFFFFF
addi t0, t0, 0x7FF
  • lui
    指令将20位立即数
    0xFFFFF
    左移12位后产生的值加载到
    t0
    中。因此,
    t0
    导致
    0xFFFFF000
  • addi
    12位立即数
    0x7FF
    ,并将其添加到寄存器
    t0
    。由于立即数的最高有效位(即符号位)为零,其符号扩展32位值为
    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