lw
lyszt.net cubre lw y otras instrucciones RISC-V con más detalle.
Formato de codificación
Descripción
lw copia un valor de la memoria a un registro. Los 32 registros forman el área de trabajo pequeña y rápida del procesador. La memoria se sitúa junto a ellos como el gran almacén: una larga fila de ranuras numeradas que contiene arreglos, texto y variables. El número de una ranura es su dirección. La computación tiene lugar en los registros, y los datos esperan en la memoria entre usos.
RISC-V hace aritmética solo en registros, nunca directamente en la memoria, por lo que un valor debe cargarse en un registro antes de usarse y almacenarse de vuelta después. lw lleva a cabo la carga. El nombre significa load word (cargar palabra), y una palabra es un valor de 32 bits, el ancho de un registro.
La forma de lw aparece a continuación. Toma el valor en rs1, un registro que contiene una dirección de memoria llamada base, suma offset, una constante pequeña, y lee el valor en la dirección resultante en el registro destino rd.
lw rd, offset(rs1)
La siguiente línea carga el valor 8 bytes después de la dirección en t0.
lw t1, 8(t0)
El manual de RISC-V llama a RISC-V una arquitectura load-store: las instrucciones de carga y almacenamiento son las únicas que acceden a la memoria, y las instrucciones aritméticas trabajan solo en registros. El espacio de direcciones es de 32 bits y direccionado por bytes, y la dirección efectiva de una carga es el registro rs1 más el offset de 12 bits con extensión de signo. El entorno de ejecución, es decir, el sistema en el que se ejecuta el programa, decide si la memoria guarda el byte menos significativo primero, llamado little-endian, o el byte más significativo primero, llamado big-endian. Un acceso está naturalmente alineado cuando su dirección se divide uniformemente por el tamaño del acceso, que es de 4 bytes para una palabra. Los accesos naturalmente alineados nunca provocan un error de alineación. Un acceso desalineado se comporta como lo defina el entorno y puede ejecutarse muy lentamente.
El offset está ahí porque los elementos en la memoria se sitúan a distancias regulares. Una palabra es de 4 bytes, por lo que los elementos consecutivos de un arreglo están a 4 bytes de distancia, en los offsets 0, 4, 8 y así sucesivamente. la coloca la dirección inicial del arreglo en un registro, y cambiar el offset lee los diferentes elementos. El ejemplo carga dos vecinos de un arreglo. El offset 0 da el primer valor, 10, y el offset 4 da el siguiente valor, 20.
Ejemplo
.data arr: .word 10, 20 .text la t0, arr lw t1, 0(t0) # t1 = 10 lw t2, 4(t0) # t2 = 20
