lw
lyszt.net couvre lw et d'autres instructions RISC-V plus en détail.
Format d'encodage
Description
lw copie une valeur de la mémoire dans un registre. Les 32 registres forment la petite zone de travail rapide du processeur. La mémoire se trouve à côté d'eux comme le grand stockage : une longue rangée d'emplacements numérotés qui contient des tableaux, du texte et des variables. Le numéro d'un emplacement est son adresse. Le calcul a lieu dans les registres, et les données attendent en mémoire entre les utilisations.
RISC-V effectue l'arithmétique uniquement sur les registres, jamais directement sur la mémoire, donc une valeur doit être chargée dans un registre avant utilisation et stockée à nouveau ensuite. lw effectue le chargement. Le nom signifie load word, et un word est une valeur de 32 bits, la largeur d'un registre.
La forme de lw apparaît ci-dessous. Elle prend la valeur dans rs1, un registre contenant une adresse mémoire appelée base, ajoute offset, une petite constante, et lit la valeur à l'adresse résultante dans le registre de destination rd.
lw rd, offset(rs1)
La ligne suivante charge la valeur située 8 octets après l'adresse dans t0.
lw t1, 8(t0)
Le manuel RISC-V qualifie RISC-V d'architecture load-store : les instructions de chargement et de stockage sont les seules à accéder à la mémoire, et les instructions arithmétiques travaillent uniquement sur les registres. L'espace d'adressage est de 32 bits et adressé par octet, et l'adresse effective d'un chargement est le registre rs1 plus l'offset de 12 bits étendu en signe. L'environnement d'exécution, c'est-à-dire le système dans lequel le programme s'exécute, décide si la mémoire contient l'octet le moins significatif en premier, appelé little-endian, ou l'octet le plus significatif en premier, appelé big-endian. Un accès est naturellement aligné lorsque son adresse se divise uniformément par la taille de l'accès, qui est de 4 octets pour un word. Les accès naturellement alignés ne déclenchent jamais d'erreur d'alignement. Un accès mal aligné se comporte comme l'environnement le définit et peut s'exécuter très lentement.
L'offset est là parce que les éléments en mémoire se trouvent à des distances régulières. Un word fait 4 octets, donc les éléments consécutifs d'un tableau sont espacés de 4 octets, aux offsets 0, 4, 8 et ainsi de suite. la place l'adresse de départ du tableau dans un registre, et changer l'offset lit les différents éléments. L'exemple charge deux voisins d'un tableau. L'offset 0 donne la première valeur, 10, et l'offset 4 donne la valeur suivante, 20.
Exemple
.data arr: .word 10, 20 .text la t0, arr lw t1, 0(t0) # t1 = 10 lw t2, 4(t0) # t2 = 20
