lbu
lyszt.net couvre lbu et d'autres instructions RISC-V plus en détail.
Format d'encodage
Description
lbu lit un octet (8 bits) depuis la mémoire comme une valeur non signée. Il s'associe à lb, et les deux ne diffèrent que par la façon dont ils remplissent le reste du registre. Tous deux lisent un octet en utilisant le même adressage. La page lb couvre les octets et la forme d'adressage. La forme de lbu apparaît ci-dessous.
lbu rd, offset(rs1)
Un registre contient 32 bits, donc un chargement d'un octet laisse 24 bits à remplir. lb copie le bit de poids fort de l'octet dans ces bits, ce qui est une extension de signe et peut produire un nombre négatif. lbu les remplit avec des 0, donc le résultat tombe toujours entre 0 et 255. Le u signifie la lecture non signée.
Les chargements de texte utilisent normalement lbu. Les codes de caractères sont non signés, et beaucoup ont leur bit de poids fort à 1, notamment les lettres accentuées et divers symboles. Le lb à extension de signe les rend négatifs et casse les comparaisons. La boucle de texte standard utilise lbu. Elle charge un octet, vérifie s'il est nul, ce qui marque la fin du texte, le traite et ajoute 1 à l'adresse.
Le manuel RISC-V définit lb et lbu comme les versions 8 bits des chargements de demi-mot, avec la même adresse effective du registre rs1 plus l'offset de 12 bits étendu en signe. La mémoire est adressée par octet, donc chaque adresse désigne un octet.
lbu convient aussi à d'autres données d'octets, notamment les canaux de couleur dans les images, les tampons de données brutes et les octets d'instruction dans un interpréteur. Les octets chargés de cette façon n'ont pas de signe à gérer, donc ils se combinent directement avec des décalages et des OR lorsqu'une valeur plus grande est reconstruite à partir d'octets individuels. N'utilisez lb que lorsque les données de 8 bits sont signées.
Exemple
.data val: .byte 0xff .text la t0, val lbu t1, 0(t0) # t1 = 255 (zero-extended)
