lipseudo

li

pseudo
Ensamblador RISC-V Referencia

lyszt.net cubre li y otras instrucciones RISC-V con más detalle.

Descripción

li carga un número constante en un registro. El nombre significa load immediate (cargar inmediato), y un inmediato es un valor fijo escrito directamente en el código. La siguiente línea almacena 42 en t0.

li t0, 42

La mayoría de los programas comienzan colocando números conocidos en registros, incluidos contadores, límites y códigos de servicio.

La palabra load proviene de una limitación del hardware. Una instrucción RISC-V tiene 32 bits de longitud y debe llevar juntas la operación, los registros y la constante. Una sola instrucción no puede contener una constante completa de 32 bits. Las constantes pequeñas caben y las grandes no.

li sortea esa limitación. Es una pseudoinstrucción, un nombre que el ensamblador reemplaza por las instrucciones reales que el valor requiera. Un valor pequeño necesita una instrucción. Un valor grande necesita dos, una que establece la parte superior y otra que suma la parte inferior, de modo que la siguiente línea funciona para un número de cualquier tamaño.

li t1, 0x10010000

El simulador muestra las instrucciones reales en las que li se expande.

El manual de RISC-V describe lui como la instrucción para construir constantes de 32 bits. Coloca un valor de 20 bits en los bits superiores del registro de destino y rellena los 12 bits más bajos con ceros.

li y la cargan cosas diferentes. li carga un número que escribiste y la carga la dirección que representa una etiqueta. El ejemplo carga un valor pequeño y uno grande, y el ensamblador maneja ambos de la misma manera.

Se expande a

addi rd, zero, imm          # small constants
lui rd, hi  +  addi rd, rd, lo   # large constants

El ensamblador reemplaza esta pseudoinstrucción con la instrucción o instrucciones reales enumeradas arriba.

Ejemplo

li t0, 42
li t1, 0x10010000