lh
lyszt.net cubre lh y otras instrucciones RISC-V con más detalle.
Formato de codificación
Descripción
lh carga una media palabra desde la memoria. Un byte son 8 bits y tiene su propia dirección, lo que lo convierte en la unidad direccionable más pequeña. Una palabra son 4 bytes, o 32 bits, y una media palabra es la mitad de eso: 2 bytes, o 16 bits. lh lee 16 bits donde lw lee 32. El direccionamiento coincide con lw: un registro base más un desplazamiento constante (consulta la página de lw). La forma aparece a continuación.
lh rd, offset(rs1)
Un registro contiene 32 bits, por lo que una carga de 16 bits debe rellenar los 16 bits restantes. lh utiliza extensión de signo. Lee el bit superior del valor de 16 bits, que marca el signo de un número con signo, y copia ese bit en los 16 bits superiores del registro. El valor conserva su signo, por lo que un -3 de 16 bits llega como un -3 de 32 bits.
Usa lh para datos con signo de 16 bits, como muestras de audio o lecturas de sensores que pueden ser negativas. Su compañera lhu, con u de unsigned (sin signo), rellena la parte superior con 0s, lo que encaja con datos que nunca son negativos. El patrón de bits 0x8000 cargado con lh se convierte en -32768, y cargado con lhu se convierte en +32768. Los bits en memoria siguen igual, y la carga decide el significado.
El manual de RISC-V define lh como cargar un valor de 16 bits desde la memoria y extenderlo con signo a 32 bits antes de almacenarlo en rd. La dirección efectiva es el registro rs1 más el desplazamiento de 12 bits extendido con signo. Un acceso está naturalmente alineado cuando su dirección es divisible por el tamaño del acceso en bytes, por lo que un acceso de media palabra está alineado en direcciones pares.
Las medias palabras son de 2 bytes, por lo que los arrays de estas se sitúan en desplazamientos 0, 2, 4, y un puntero avanza por ellos sumando 2.
Ejemplo
.data val: .half -5 .text la t0, val lh t1, 0(t0) # t1 = -5 (sign-extended)
