Я предполагаю, что это rv64i, когда задаете подобные вопросы в 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
, который показывает оба варианта решения, увеличивая значение в нескольких инструкциях.Или загрузите значение в регистр.
Хорошо, да, компилятор использовал rv64ic, он жаловался на мою командную строку, поэтому я использовал:
riscv64-none-elf-gcc -c -O2 so.c -o so.o
Я создал кросс-компилятор, который вы можетевозможно, используйте Godbolt, если хотите.
lui дает вам 20 битов немедленного.При использовании инструкций только любое 64-битное значение заняло бы 3 luis, некоторое смещение и орринг.И Адди или Орри.Затем используйте sd для хранения двойного слова (64 бита).