lapseudo

la

pseudo
Ensamblador RISC-V Referencia

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

Descripción

la carga la dirección de algo en un registro. Esa dirección es una ubicación de memoria, y el valor almacenado en esa ubicación es algo aparte. El nombre significa load address (cargar dirección).

Cuando reservas datos en memoria, les das un nombre como arr o msg, lo que te evita tener que rastrear números de dirección sin procesar. Ese nombre es una etiqueta, un sustituto legible de una dirección de memoria. La siguiente línea carga la dirección marcada por la etiqueta arr en t0. Proporciona la ubicación donde comienza el arreglo y no lee el contenido del arreglo.

la t0, arr

Las instrucciones de carga y almacenamiento (lw, sw y las demás) toman una dirección contenida en un registro. Antes de poder leer o escribir datos con nombre, su dirección debe estar en un registro, y la la coloca ahí. Leer el valor requiere dos instrucciones. la encuentra dónde están los datos, y lw lee lo que hay ahí.

El manual de RISC-V describe auipc como la instrucción para construir direcciones relativas al pc. Afirma que un auipc seguido de una carga o almacenamiento con un desplazamiento de 12 bits puede alcanzar cualquier dirección de datos relativa al pc de 32 bits.

Una dirección y su contenido difieren de la misma manera en que difieren un puntero y un valor. Una vez que la dirección está en un registro, accedes a elementos individuales sumándole desplazamientos. El ejemplo carga la dirección de un fragmento de texto en a0, que es lo que requiere el servicio de impresión de cadenas. Hay que indicarle dónde está el texto, y él lee el texto desde ahí. la es una pseudoinstrucción que el ensamblador construye a partir de un par de instrucciones reales.

Se expande a

auipc rd, hi(label)
addi  rd, rd, lo(label)

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

Ejemplo

.data
msg: .string "hi"
.text
la a0, msg     # a0 = address of msg