li
pseudolyszt.net aborda li e outras instruções RISC-V com mais detalhes.
Descrição
li carrega um número constante em um registrador. O nome significa load immediate (carregar imediato), e um imediato é um valor fixo escrito diretamente no código. A próxima linha armazena 42 em t0.
li t0, 42
A maioria dos programas começa colocando números conhecidos em registradores, incluindo contadores, limites e códigos de serviço.
A palavra load vem de um limite de hardware. Uma instrução RISC-V tem 32 bits de comprimento e deve carregar a operação, os registradores e a constante juntos. Uma instrução não consegue conter uma constante completa de 32 bits. Constantes pequenas cabem e as grandes não.
li contorna esse limite. É uma pseudoinstrução, um nome que o montador substitui pelas instruções reais que o valor exigir. Um valor pequeno precisa de uma instrução. Um valor grande precisa de duas, uma que define a parte superior e outra que adiciona a parte inferior, de modo que a próxima linha funciona para um número de qualquer tamanho.
li t1, 0x10010000
O simulador exibe as instruções reais nas quais li se expande.
O manual do RISC-V descreve lui como a instrução para construir constantes de 32 bits. Ela coloca um valor de 20 bits nos bits superiores do registrador de destino e preenche os 12 bits mais baixos com zeros.
li e la carregam coisas diferentes. li carrega um número que você digitou e la carrega o endereço que um rótulo representa. O exemplo carrega um valor pequeno e um grande, e o montador trata ambos da mesma forma.
Expande para
addi rd, zero, imm # small constants lui rd, hi + addi rd, rd, lo # large constants
O montador substitui esta pseudoinstrução pela instrução ou instruções reais listadas acima.
Exemplo
li t0, 42 li t1, 0x10010000
