lh

lh

Assembleur RISC-V Référence

lyszt.net couvre lh 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

lh charge un demi-mot depuis la mémoire. Un octet fait 8 bits et possède sa propre adresse, ce qui en fait la plus petite unité adressable. Un mot fait 4 octets, soit 32 bits, et un demi-mot en est la moitié : 2 octets, soit 16 bits. lh lit 16 bits là où lw en lit 32. L'adressage est identique à celui de lw : un registre de base plus un décalage constant (voir la page lw). La forme apparaît ci-dessous.

lh rd, offset(rs1)

Un registre contient 32 bits, donc un chargement de 16 bits doit remplir les 16 bits restants. lh utilise l'extension de signe. Il lit le bit de poids fort de la valeur de 16 bits, qui marque le signe d'un nombre signé, et copie ce bit dans les 16 bits supérieurs du registre. La valeur conserve son signe, donc un -3 sur 16 bits arrive comme un -3 sur 32 bits.

Utilisez lh pour les données signées de 16 bits, comme des échantillons audio ou des relevés de capteurs pouvant être négatifs. Son partenaire lhu, avec u pour non signé, remplit le haut avec des 0, ce qui convient aux données qui ne deviennent jamais négatives. Le motif binaire 0x8000 chargé avec lh devient -32768, et chargé avec lhu il devient +32768. Les bits en mémoire restent les mêmes, et le chargement décide de la signification.

Le manuel RISC-V définit lh comme le chargement d'une valeur de 16 bits depuis la mémoire et son extension de signe à 32 bits avant de la stocker dans rd. L'adresse effective est le registre rs1 plus le décalage de 12 bits étendu en signe. Un accès est naturellement aligné lorsque son adresse est divisible par la taille de l'accès en octets, donc un accès à un demi-mot est aligné aux adresses paires.

Les demi-mots font 2 octets, donc les tableaux de ceux-ci se situent aux décalages 0, 2, 4, et un pointeur les parcourt en ajoutant 2.

Exemple

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