lb

lb

Assembleur RISC-V Référence

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

lb lit un octet depuis la mémoire, qui est la plus petite unité qu'un chargement peut récupérer. La mémoire est constituée d'octets, chaque octet fait 8 bits, et une adresse identifie un octet. lw lit 4 octets, lh en lit 2, et lb en lit 1. Il utilise le même adressage que les autres chargements : un registre de base plus un décalage (voir la page lw). La forme est présentée ci-dessous.

lb rd, offset(rs1)

Un registre contient 32 bits et un octet en contient 8, donc les 24 bits supérieurs ont besoin d'une valeur. lb effectue une extension de signe : il copie le bit de poids fort de l'octet dans tous les bits supérieurs, conservant la valeur comme un nombre signé. Un octet contenant -5 arrive sous la forme d'un -5 sur 32 bits.

Le choix signé/non signé importe surtout pour le texte, la donnée d'octet la plus courante, car les codes de caractères ne sont pas signés. De nombreux codes de caractères ont leur bit de poids fort à 1. Charger l'un d'eux avec lb, qui étend le signe, produit un nombre négatif, et les comparaisons avec des codes de caractères positifs ordinaires échouent alors. Utilisez lbu, load byte unsigned, pour le texte ; il remplit les bits supérieurs avec des 0. Utilisez lb pour les données signées, comme de petits décalages pouvant être positifs ou négatifs.

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 de registre rs1 plus le décalage de 12 bits étendu en signe. La mémoire est adressée par octet, donc une adresse identifie un octet.

Les octets sont espacés d'une adresse, donc une boucle parcourt un tableau d'octets en ajoutant 1 à l'adresse. Une boucle typique lit un octet, vérifie s'il est nul (le marqueur de fin de texte), agit dessus, et avance l'adresse de 1.

Exemple

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