lipseudo

li

pseudo
Assembly RISC-V Referência

lyszt.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