sh

sh

Assembly RISC-V Referência

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

sh grava um halfword, 16 bits ou 2 bytes, na memória. Ele corresponde aos carregamentos lh e lhu e armazena o tamanho mais estreito onde sw armazena a palavra completa. A forma é mostrada abaixo. Ele pega o valor no registrador de origem rs2 e grava seus 16 bits mais baixos no endereço no registrador de base rs1 mais o offset. O layout corresponde ao sw, com o registrador de origem nomeado primeiro.

sh rs2, offset(rs1)

Um registrador contém 32 bits e apenas 16 são armazenados, então sh mantém os 16 bits mais baixos e descarta os 16 bits superiores. Armazenamentos não têm escolha com ou sem sinal. Essa escolha pertence aos carregamentos, onde um valor estreito deve ser ampliado para preencher um registrador e os bits ausentes precisam de uma regra. Um armazenamento estreita o valor, e manter os bits baixos é o único comportamento que faz sentido. Se o registrador contém um valor grande demais para 16 bits, os bits extras são perdidos sem aviso, então verifique o intervalo antes de armazenar.

O manual do RISC-V diz que sh armazena os 16 bits baixos do registrador rs2 na memória no endereço de rs1 mais o offset de 12 bits estendido com sinal. Armazenamentos de halfword em endereços pares são naturalmente alinhados e nunca geram um erro de alinhamento. Um armazenamento em um endereço que não é naturalmente alinhado se comporta como o ambiente de execução definir, e o manual diz que pode executar extremamente lentamente.

sh grava todos os formatos de 16 bits que lh e lhu leem de volta, como amostras de áudio, dados de pixel de 16 bits e arrays de halfword. Um padrão comum é ler, modificar e gravar. Carregue um halfword com lhu, ajuste-o no registrador e armazene-o de volta com sh. Apenas os 2 bytes alvo mudam e os bytes ao redor deles permanecem como estavam. Halfwords ficam a 2 bytes de distância, então os loops movem o endereço em 2.

Exemplo

la t0, slot
li t1, -5
sh t1, 0(t0)   # memory at slot now holds the low 16 bits of -5