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)