lbu

lbu

Assembly RISC-V Referência

lyszt.net aborda lbu e outras instruções RISC-V com mais detalhes.

Formato de codificação

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

Descrição

lbu lê um byte (8 bits) da memória como um valor sem sinal. Ele faz par com lb, e os dois diferem apenas na forma como preenchem o restante do registrador. Ambos leem um byte usando o mesmo endereçamento. A página lb cobre bytes e a forma de endereçamento. A forma de lbu aparece abaixo.

lbu rd, offset(rs1)

Um registrador contém 32 bits, então um carregamento de 1 byte deixa 24 bits para preencher. lb copia o bit mais significativo do byte para esses bits, o que é extensão de sinal e pode produzir um número negativo. lbu os preenche com 0s, então o resultado sempre fica entre 0 e 255. O u significa a leitura sem sinal.

Carregamentos de texto normalmente usam lbu. Os códigos de caractere são sem sinal, e muitos têm o bit mais significativo definido, incluindo letras acentuadas e vários símbolos. O lb com extensão de sinal os torna negativos e quebra as comparações. O laço de texto padrão usa lbu. Ele carrega um byte, verifica se é zero, o que marca o fim do texto, processa-o e adiciona 1 ao endereço.

O manual do RISC-V define lb e lbu como as versões de 8 bits dos carregamentos de meia palavra, com o mesmo endereço efetivo do registrador rs1 mais o offset de 12 bits com extensão de sinal. A memória é endereçada por byte, então cada endereço nomeia um byte.

lbu também serve para outros dados de byte, incluindo canais de cor em imagens, buffers de dados brutos e bytes de instrução em um interpretador. Bytes carregados dessa forma não têm sinal a tratar, então se combinam diretamente com deslocamentos e ORs quando um valor maior é reconstruído a partir de bytes individuais. Use lb apenas quando os dados de 8 bits forem com sinal.

Exemplo

.data
val: .byte 0xff
.text
la t0, val
lbu t1, 0(t0)   # t1 = 255 (zero-extended)