lhu

lhu

Assembly RISC-V Referência

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

lhu lê uma meia-palavra (16 bits, ou 2 bytes) da memória e a trata como não assinada. Ela faz par com lh, e as duas diferem em como preenchem a metade superior do registrador de destino. Ambas leem 16 bits com o mesmo endereçamento. Meias-palavras e a forma de endereçamento são abordadas na página lh. A forma de lhu é mostrada abaixo.

lhu rd, offset(rs1)

Um registrador contém 32 bits, então um carregamento de 16 bits deve preencher os 16 bits superiores. lh copia o bit de sinal para eles, o que mantém os números negativos negativos. lhu os preenche com 0s, chamado de extensão de zeros, então o resultado é sempre não negativo, de 0 a 65535. O u no nome marca a leitura não assinada.

Os dados decidem qual usar. Escolha lh para valores que podem ser negativos e lhu para valores que nunca são negativos. O padrão de bits 0xFFFF carregado com lhu é 65535, e os mesmos bits carregados com lh são -1.

O manual RISC-V define lhu como carregar um valor de 16 bits da memória e estendê-lo com zeros para 32 bits antes de armazená-lo em rd. O endereço efetivo é o registrador rs1 mais o offset de 12 bits estendido com sinal.

A maioria dos dados de 16 bits é não assinada. Códigos de caracteres em algumas codificações de texto, números de porta e checksums em dados de rede, formatos de pixel de 16 bits e campos de comprimento em formatos de arquivo são exemplos. A extensão de sinal daria um valor errado para qualquer um deles assim que o bit superior estiver definido, então lhu é o carregamento correto. Meias-palavras ficam a 2 bytes de distância, então loops sobre elas movem o endereço em 2.

Exemplo

.data
val: .half 0xffff
.text
la t0, val
lhu t1, 0(t0)   # t1 = 65535 (zero-extended)