sh

sh

Assembleur RISC-V Référence

lyszt.net couvre sh et d'autres instructions RISC-V plus en détail.

Format d'encodage

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

Description

sh écrit un demi-mot, 16 bits ou 2 octets, en mémoire. Il correspond aux chargements lh et lhu et stocke la taille plus étroite là où sw stocke le mot complet. La forme est indiquée ci-dessous. Il prend la valeur dans le registre source rs2 et écrit ses 16 bits les plus bas à l'adresse dans le registre de base rs1 plus le décalage. La disposition correspond à sw, avec le registre source nommé en premier.

sh rs2, offset(rs1)

Un registre contient 32 bits et seuls 16 sont stockés, donc sh conserve les 16 bits les plus bas et abandonne les 16 bits supérieurs. Les stockages n'ont pas de choix signé ou non signé. Ce choix appartient aux chargements, où une valeur étroite doit être élargie pour remplir un registre et les bits manquants ont besoin d'une règle. Un stockage rétrécit la valeur, et conserver les bits bas est le seul comportement qui ait du sens. Si le registre contient une valeur trop grande pour 16 bits, les bits supplémentaires sont perdus sans avertissement, donc vérifiez la plage avant de stocker.

Le manuel RISC-V indique que sh stocke les 16 bits bas du registre rs2 en mémoire à l'adresse de rs1 plus le décalage de 12 bits étendu en signe. Les stockages de demi-mots à des adresses paires sont naturellement alignés et ne déclenchent jamais d'erreur d'alignement. Un stockage à une adresse qui n'est pas naturellement alignée se comporte comme l'environnement d'exécution le définit, et le manuel indique qu'il peut s'exécuter extrêmement lentement.

sh écrit tous les formats 16 bits que lh et lhu relisent, comme les échantillons audio, les données de pixels 16 bits et les tableaux de demi-mots. Un schéma courant est lire, modifier et écrire. Chargez un demi-mot avec lhu, ajustez-le dans le registre et stockez-le à nouveau avec sh. Seuls les 2 octets ciblés changent et les octets autour d'eux restent tels qu'ils étaient. Les demi-mots sont espacés de 2 octets, donc les boucles déplacent l'adresse de 2.

Exemple

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