sb

sb

Ensamblador RISC-V Referencia

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

sb escribe un byte (8 bits) en memoria, que es la cantidad más pequeña que puede escribir un store. Es el equivalente de store de las cargas lb y lbu. La sintaxis aparece a continuación. Lee el valor del registro fuente rs2 y escribe sus 8 bits más bajos en la dirección formada por el registro base rs1 más el offset. La disposición de los operandos coincide con sw, con el registro fuente listado primero.

sb rs2, offset(rs1)

Solo los 8 bits más bajos de los 32 bits del registro llegan a memoria y los bits restantes se descartan. Un store no tiene forma con signo ni sin signo, ya que estrecha el valor y conserva el byte bajo. Un valor más ancho que un byte pierde sus bits extra sin advertencia. Almacenar 300 escribe 44, porque 300 se desborda tras 256.

La unidad más pequeña de la memoria es un byte, así que sb construye datos byte a byte, para tareas como ensamblar texto carácter por carácter, llenar un búfer o escribir valores de color individuales. Los bytes consecutivos ocupan direcciones separadas por uno, así que un bucle avanza sumando 1.

El manual de RISC-V indica que sb almacena los 8 bits bajos del registro rs2 en memoria en la dirección de rs1 más el offset de 12 bits con extensión de signo. La memoria está direccionada por bytes, así que un store de byte siempre está alineado de forma natural.

Un ejercicio común escribe texto a mano. Almacena el código de cada carácter con sb, termina la secuencia con un byte 0 y luego imprímelo. Los códigos 72, 105 y 0 en memoria se imprimen como la palabra Hi, lo que muestra que una cadena son bytes en posiciones de memoria consecutivas terminadas por un cero. Un store cambia solo el byte objetivo y los bytes contiguos conservan sus valores anteriores.

Ejemplo

la t0, slot
li t1, 200
sb t1, 0(t0)   # memory at slot now holds the low 8 bits, 200