lb

lb

Ensamblador RISC-V Referencia

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

lb lee un byte de la memoria, que es la unidad más pequeña que una carga puede recuperar. La memoria se compone de bytes, cada byte tiene 8 bits, y una dirección identifica un byte. lw lee 4 bytes, lh lee 2, y lb lee 1. Utiliza el mismo direccionamiento que las demás cargas: un registro base más un desplazamiento (consulta la página de lw). La forma se muestra a continuación.

lb rd, offset(rs1)

Un registro contiene 32 bits y un byte contiene 8, por lo que los 24 bits superiores necesitan un valor. lb extiende el signo: copia el bit superior del byte en todos los bits superiores, manteniendo el valor como un número con signo. Un byte que contiene -5 llega como un -5 de 32 bits.

La elección entre con signo y sin signo importa sobre todo para el texto, el dato de tipo byte más común, porque los códigos de caracteres son sin signo. Muchos códigos de caracteres tienen su bit superior activado. Cargar uno con el lb que extiende el signo produce un número negativo, y las comparaciones contra códigos de caracteres positivos ordinarios fallan entonces. Usa lbu, carga de byte sin signo, para texto; rellena los bits superiores con 0s. Usa lb para datos con signo, como pequeños desplazamientos que pueden ser positivos o negativos.

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 extendido con signo. La memoria está direccionada por bytes, por lo que una dirección identifica un byte.

Los bytes están separados por una dirección, así que un bucle recorre un arreglo de bytes sumando 1 a la dirección. Un bucle típico lee un byte, comprueba si es cero (el marcador del final del texto), actúa sobre él y avanza la dirección en 1.

Ejemplo

.data
val: .byte -5
.text
la t0, val
lb t1, 0(t0)   # t1 = -5 (sign-extended)