lh

lh

Ensamblador RISC-V Referencia

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

Formato de codificación

R
31–25funct7
24–20rs2
19–15rs1
14–12funct3
11–7rd
6–0opcode
I
31–20imm[11:0]
19–15rs1
14–12funct3
11–7rd
6–0opcode
S
31–25imm[11:5]
24–20rs2
19–15rs1
14–12funct3
11–7imm[4:0]
6–0opcode
B
31–25imm[12,10:5]
24–20rs2
19–15rs1
14–12funct3
11–7imm[4:1,11]
6–0opcode
U
31–12imm[31:12]
11–7rd
6–0opcode
J
31–12imm[20,10:1,11,19:12]
11–7rd
6–0opcode

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)