lhu

lhu

Ensamblador RISC-V Referencia

lyszt.net cubre lhu 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

lhu lee una media palabra (16 bits, o 2 bytes) de la memoria y la trata como sin signo. Se empareja con lh, y ambas difieren en cómo rellenan la mitad superior del registro destino. Ambas leen 16 bits con el mismo direccionamiento. Las medias palabras y la forma de direccionamiento se tratan en la página de lh. La forma de lhu se muestra a continuación.

lhu rd, offset(rs1)

Un registro contiene 32 bits, por lo que una carga de 16 bits debe rellenar los 16 superiores. lh copia el bit de signo en ellos, lo que mantiene negativos los números negativos. lhu los rellena con 0s, lo que se denomina extensión de ceros, por lo que el resultado siempre es no negativo, de 0 a 65535. La u del nombre indica la lectura sin signo.

Los datos deciden cuál usar. Elige lh para valores que pueden ser negativos y lhu para valores que nunca son negativos. El patrón de bits 0xFFFF cargado con lhu es 65535, y los mismos bits cargados con lh son -1.

El manual de RISC-V define lhu como la carga de un valor de 16 bits de la memoria y su extensión de ceros a 32 bits antes de almacenarlo en rd. La dirección efectiva es el registro rs1 más el desplazamiento de 12 bits con extensión de signo.

La mayoría de los datos de 16 bits son sin signo. Los códigos de caracteres en algunas codificaciones de texto, los números de puerto y las sumas de comprobación en datos de red, los formatos de píxeles de 16 bits y los campos de longitud en formatos de archivo son ejemplos. La extensión de signo daría un valor incorrecto para cualquiera de ellos una vez que el bit superior está establecido, por lo que lhu es la carga correcta. Las medias palabras están separadas por 2 bytes, por lo que los bucles sobre ellas mueven la dirección en 2.

Ejemplo

.data
val: .half 0xffff
.text
la t0, val
lhu t1, 0(t0)   # t1 = 65535 (zero-extended)