lui

lui

Assembly RISC-V Referência

lyszt.net aborda lui e outras instruções RISC-V com mais detalhes.

Formato de codificação

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

Descrição

lui monta constantes grandes. Uma instrução RISC-V ocupa 32 bits, e esses bits carregam a operação, seus registradores e qualquer constante. Uma instrução normal pode conter cerca de 12 bits de constante, o que cobre números pequenos, mas fica aquém de um valor completo de 32 bits. Várias instruções fornecem as partes de uma constante grande.

lui (load upper immediate) fornece a parte superior. Ele recebe uma constante de 20 bits e a escreve nos 20 bits superiores do registrador de destino, deixando os 12 bits inferiores em zero. A forma aparece abaixo.

lui rd, value

Uma constante completa precisa de duas instruções. lui define os 20 bits superiores, e addi adiciona os 12 bits inferiores. A pseudoinstrução li realiza esse trabalho para você, então um lui escrito à mão raramente é necessário para números comuns.

O manual do RISC-V afirma que a sintaxe de montagem de lui e auipc omite os 12 bits inferiores da constante, porque esses bits são sempre zero. Ele também afirma que um lui seguido de jalr pode alcançar qualquer endereço absoluto de 32 bits: lui carrega os 20 bits superiores do endereço de destino e jalr adiciona os bits inferiores.

lui aparece diretamente ao carregar endereços redondos cujos bits inferiores são zero, como os endereços fixos de dispositivos de hardware, onde um único lui fornece o valor inteiro. Seu parente próximo é auipc, que constrói um endereço relativo à localização atual.

Exemplo

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