assembly 将值加载到RISC-V中的寄存器

6vl6ewon  于 2022-12-13  发布在  其他
关注(0)|答案(2)|浏览(162)

我只是想找人帮我把一些值加载到某些寄存器中。
该任务是“指示编译器将值0x2222333344445555和0x1111222233334444分别存储在地址0x1000100010001000和0x1000100010001100。在运行时将值加载到寄存器x6和x7......"。
从阅读PDF文件提供的信息以及问题,到目前为止我的代码看起来像这样:

ORG 0x1000100010001000
a: DD 0x2222333344445555

ORG 0x1000100010001100
b: DD 0x1111222233334444
4ktjp1zp

4ktjp1zp1#

我假设这是rv 64 i,当问risc-v这样的问题时,你需要指定指令集。
您可以让编译器引导您开始

void fun ( void )
{
    unsigned long long *a;
    a=0x1000100010001000;
    *a=0x2222333344445555;
    a=0x1000100010001100;
    *a=0x1111222233334444;
}

例如:

0000000000000000 <fun>:
   0:   10001737            lui x14,0x10001
   4:   02071793            slli    x15,x14,0x20
   8:   00000637            lui x12,0x0
   c:   97ba                    add x15,x15,x14
   e:   00063703            ld  x14,0(x12) # 0 <fun>
  12:   000006b7            lui x13,0x0
  16:   e398                    sd  x14,0(x15)
  18:   000007b7            lui x15,0x0
  1c:   0007b783            ld  x15,0(x15) # 0 <fun>
  20:   0006b703            ld  x14,0(x13) # 0 <fun>
  24:   e398                    sd  x14,0(x15)
  26:   8082                    ret

Disassembly of section .srodata.cst8:

0000000000000000 <.LC0>:
   0:   5555    
   2:   4444    
   4:   22223333

0000000000000008 <.LC1>:
   8:   1100    
   a:   1000    
   c:   1000    
   e:   1000    

0000000000000010 <.LC2>:
  10:   4444    
  12:   22223333
  16:   1111

它显示了两种解决方案,在多个指令中构建值。或者将值加载到寄存器中。
好的,是的,编译器使用了rv 64 ic,它抱怨我的命令行,所以我使用了:

riscv64-none-elf-gcc -c -O2 so.c -o so.o

我建立了一个交叉编译器,如果你喜欢的话,你可以使用godbolt。
lui给你20位的立即数。使用指令,任何64位的值都需要3个lui,一些移位和或运算。还有一个addi或orri。然后使用sd来进行双字(64位)存储。

r6vfmomb

r6vfmomb2#

是的,它有一个伪指令,用于直接加载寄存器,称为“li”(立即加载)。格式为:li x5,5 #加载十进制数为5的x2寄存器。“li”伪指令使用“addi”指令与x0寄存器组合,该寄存器始终为0(硬连接为0)。示例如下:addi x5,x0,5 #这和上面的例子做的完全一样。你可以在这里测试你的代码,而不是使用gcc:https://riscvasm.lucasteske.dev/#

相关问题