lhu
lyszt.net couvre lhu et d'autres instructions RISC-V plus en détail.
Format d'encodage
Description
lhu lit un demi-mot (16 bits, ou 2 octets) depuis la mémoire et le traite comme non signé. Il s'associe à lh, et les deux diffèrent dans la façon dont ils remplissent la moitié supérieure du registre de destination. Tous deux lisent 16 bits avec le même adressage. Les demi-mots et la forme d'adressage sont couverts sur la page lh. La forme de lhu est présentée ci-dessous.
lhu rd, offset(rs1)
Un registre contient 32 bits, donc un chargement de 16 bits doit remplir les 16 bits supérieurs. lh copie le bit de signe sur ceux-ci, ce qui préserve le signe des nombres négatifs. lhu les remplit de 0, ce qu'on appelle l'extension par zéros, de sorte que le résultat est toujours non négatif, de 0 à 65535. Le u dans le nom indique la lecture non signée.
Les données déterminent lequel utiliser. Choisissez lh pour les valeurs qui peuvent être négatives et lhu pour les valeurs qui ne sont jamais négatives. Le motif binaire 0xFFFF chargé avec lhu vaut 65535, et les mêmes bits chargés avec lh valent -1.
Le manuel RISC-V définit lhu comme le chargement d'une valeur de 16 bits depuis la mémoire et son extension par zéros à 32 bits avant de la stocker dans rd. L'adresse effective est le registre rs1 plus l'offset de 12 bits étendu en signe.
La plupart des données de 16 bits sont non signées. Les codes de caractères dans certains encodages de texte, les numéros de port et les sommes de contrôle dans les données réseau, les formats de pixels 16 bits et les champs de longueur dans les formats de fichier en sont des exemples. L'extension de signe donnerait une valeur erronée pour chacun d'eux dès que le bit supérieur est défini, donc lhu est le bon chargement. Les demi-mots sont espacés de 2 octets, donc les boucles sur ceux-ci déplacent l'adresse de 2.
Exemple
.data val: .half 0xffff .text la t0, val lhu t1, 0(t0) # t1 = 65535 (zero-extended)
