lbu
lyszt.net cubre lbu y otras instrucciones RISC-V con más detalle.
Formato de codificación
Descripción
lbu lee un byte (8 bits) de la memoria como un valor sin signo. Se empareja con lb, y los dos difieren solo en cómo rellenan el resto del registro. Ambos leen un byte usando el mismo direccionamiento. La página de lb cubre los bytes y la forma de direccionamiento. La forma de lbu aparece a continuación.
lbu rd, offset(rs1)
Un registro contiene 32 bits, por lo que una carga de 1 byte deja 24 bits por rellenar. lb copia el bit superior del byte en esos bits, lo que es extensión de signo y puede producir un número negativo. lbu los rellena con 0s, por lo que el resultado siempre queda entre 0 y 255. La u significa lectura sin signo.
Las cargas de texto normalmente usan lbu. Los códigos de caracteres son sin signo, y muchos tienen su bit superior establecido, incluidas las letras acentuadas y varios símbolos. El lb que extiende el signo los hace negativos y rompe las comparaciones. El bucle de texto estándar usa lbu. Carga un byte, comprueba si es cero, lo que marca el final del texto, lo procesa y suma 1 a la dirección.
El manual de RISC-V define lb y lbu como las versiones de 8 bits de las cargas de media palabra, con la misma dirección efectiva del registro rs1 más el desplazamiento de 12 bits con extensión de signo. La memoria está direccionada por bytes, por lo que cada dirección nombra un byte.
lbu también sirve para otros datos de bytes, incluidos los canales de color en imágenes, los búferes de datos sin procesar y los bytes de instrucciones en un intérprete. Los bytes cargados de esta manera no tienen signo que manejar, por lo que se combinan directamente con desplazamientos y ORs cuando se reconstruye un valor mayor a partir de bytes individuales. Use lb solo cuando los datos de 8 bits tengan signo.
Ejemplo
.data val: .byte 0xff .text la t0, val lbu t1, 0(t0) # t1 = 255 (zero-extended)
