sb
lyszt.net aborda sb e outras instruções RISC-V com mais detalhes.
Formato de codificação
Descrição
sb grava um byte (8 bits) na memória, que é a menor quantidade que um store pode gravar. É o equivalente em escrita dos carregamentos lb e lbu. A sintaxe aparece abaixo. Ele lê o valor no registrador de origem rs2 e grava seus 8 bits mais baixos no endereço formado pelo registrador de base rs1 mais o offset. O layout dos operandos corresponde ao sw, com o registrador de origem listado primeiro.
sb rs2, offset(rs1)
Apenas os 8 bits mais baixos dos 32 bits do registrador chegam à memória e os bits restantes são descartados. Um store não tem forma com sinal ou sem sinal, pois ele estreita o valor e mantém o byte baixo. Um valor maior que um byte perde seus bits extras sem aviso. Gravar 300 escreve 44, porque 300 ultrapassa 256 e dá a volta.
A menor unidade da memória é o byte, então sb constrói dados um byte por vez, para tarefas como montar texto caractere por caractere, preencher um buffer ou gravar valores de cor individuais. Bytes consecutivos ocupam endereços separados por 1, então um loop avança somando 1.
O manual do RISC-V afirma que sb grava os 8 bits baixos do registrador rs2 na memória no endereço de rs1 mais o offset de 12 bits estendido com sinal. A memória é endereçada por byte, então um store de byte é sempre naturalmente alinhado.
Um exercício comum escreve texto à mão. Grave o código de cada caractere com sb, termine a sequência com um byte 0 e depois imprima-a. Os códigos 72, 105 e 0 na memória são impressos como a palavra Hi, o que mostra que uma string são bytes em posições consecutivas de memória terminadas por um zero. Um store altera apenas o byte alvo e os bytes ao lado mantêm seus valores anteriores.
Exemplo
la t0, slot li t1, 200 sb t1, 0(t0) # memory at slot now holds the low 8 bits, 200
