lbu
lyszt.net aborda lbu e outras instruções RISC-V com mais detalhes.
Formato de codificação
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)
