lb

lb

Assembly RISC-V Referência

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

lb lê um byte da memória, que é a menor unidade que um carregamento pode recuperar. A memória é construída a partir de bytes, cada byte tem 8 bits, e um endereço identifica um byte. lw lê 4 bytes, lh lê 2, e lb lê 1. Ele usa o mesmo endereçamento dos outros carregamentos: um registrador base mais um deslocamento (veja a página lw). A forma é mostrada abaixo.

lb rd, offset(rs1)

Um registrador contém 32 bits e um byte contém 8, então os 24 bits superiores precisam de um valor. lb faz extensão de sinal: copia o bit superior do byte para todos os bits superiores, mantendo o valor como um número com sinal. Um byte contendo -5 chega como um -5 de 32 bits.

A escolha entre com sinal/sem sinal importa mais para texto, o dado de byte mais comum, porque os códigos de caracteres são sem sinal. Muitos códigos de caracteres têm o bit superior definido. Carregar um deles com o lb que faz extensão de sinal produz um número negativo, e comparações com códigos de caracteres positivos comuns então falham. Use lbu, load byte unsigned, para texto; ele preenche os bits superiores com 0s. Use lb para dados com sinal, como pequenos deslocamentos que podem ser positivos ou negativos.

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 de registrador rs1 mais o deslocamento de 12 bits com extensão de sinal. A memória é endereçada por byte, então um endereço identifica um byte.

Os bytes ficam a um endereço de distância, então um laço percorre um array de bytes adicionando 1 ao endereço. Um laço típico lê um byte, verifica se é zero (o marcador de fim de texto), age sobre ele, e avança o endereço em 1.

Exemplo

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