lui

lui

Асемблер RISC-V Посилання

lyszt.net охоплює lui та інші інструкції RISC-V більш детально.

Формат кодування

R
31–25funct7
24–20rs2
19–15rs1
14–12funct3
11–7rd
6–0opcode
I
31–20imm[11:0]
19–15rs1
14–12funct3
11–7rd
6–0opcode
S
31–25imm[11:5]
24–20rs2
19–15rs1
14–12funct3
11–7imm[4:0]
6–0opcode
B
31–25imm[12,10:5]
24–20rs2
19–15rs1
14–12funct3
11–7imm[4:1,11]
6–0opcode
U
31–12imm[31:12]
11–7rd
6–0opcode
J
31–12imm[20,10:1,11,19:12]
11–7rd
6–0opcode

Опис

lui збирає великі константи. Інструкція RISC-V займає 32 біти, і ці біти містять операцію, її регістри та будь-яку константу. Звичайна інструкція може вмістити приблизно 12 бітів константи, що покриває малі числа, але недостатньо для повного 32-бітного значення. Кілька інструкцій постачають частини великої константи.

lui (load upper immediate) постачає верхню частину. Вона приймає 20-бітну константу і записує її у верхні 20 бітів регістра призначення, залишаючи молодші 12 бітів нульовими. Форма показана нижче.

lui rd, value

Повна константа потребує двох інструкцій. lui встановлює старші 20 бітів, а addi додає молодші 12. Псевдоінструкція li виконує цю роботу за вас, тому написаний вручну lui рідко потрібен для звичайних чисел.

Посібник RISC-V стверджує, що синтаксис асемблера lui та auipc опускає молодші 12 бітів константи, оскільки ці біти завжди нульові. Він також стверджує, що lui, за яким слідує jalr, може досягти будь-якої 32-бітної абсолютної адреси: lui завантажує старші 20 бітів цільової адреси, а jalr додає молодші біти.

lui з'являється безпосередньо при завантаженні круглих адрес, молодші біти яких нульові, таких як фіксовані адреси апаратних пристроїв, де один lui постачає все значення. Його близький родич — auipc, який будує адресу відносно поточного місцеположення.

Приклад

lui t0, 0x10     # t0 = 0x10000 (0x10 << 12)