sw
lyszt.net couvre sw et d'autres instructions RISC-V plus en détail.
Format d'encodage
Description
sw prend une valeur dans un registre et l'écrit en mémoire, l'inverse de lw. Le nom signifie store word (stocker un mot), et un mot fait 32 bits. Les chargements déplacent les données de la mémoire vers les registres pour qu'elles puissent être traitées, et les stockages renvoient les résultats. Ces deux instructions constituent le cycle charger, calculer et stocker de RISC-V, car l'arithmétique se fait uniquement dans les registres.
La syntaxe de sw apparaît ci-dessous. L'ordre des opérandes diffère de la plupart des instructions.
sw rs2, offset(rs1)
rs2 contient la valeur à écrire. Le deuxième opérande, offset(rs1), donne l'adresse de destination en mémoire : l'adresse dans le registre de base rs1 plus un petit décalage constant, le même adressage que celui utilisé par lw. La ligne ci-dessous écrit la valeur contenue dans t1 à l'adresse contenue dans t0.
sw t1, 0(t0)
sw laisse chaque registre inchangé. Son effet porte entièrement sur la mémoire, alors que presque toutes les autres instructions écrivent dans un registre.
Le manuel RISC-V indique que sw, sh et sb stockent des valeurs de 32 bits, 16 bits et 8 bits depuis les bits de poids faible du registre rs2 vers la mémoire. L'adresse effective est le registre rs1 plus le décalage de 12 bits étendu en signe. Les chargements et les stockages à des adresses naturellement alignées ne déclenchent jamais d'erreur d'alignement, et le manuel garantit qu'ils s'exécutent de manière atomique, en une seule étape indivisible.
Les stockages enregistrent les résultats dans des tableaux et des variables, et une fonction les utilise pour placer des valeurs dans son espace de travail sur la pile. Un stockage écrase les 4 octets à l'adresse cible. L'exemple écrit 99 dans un emplacement étiqueté en mémoire, remplaçant ce qui s'y trouvait. La mémoire conserve cette valeur jusqu'à ce qu'un autre stockage l'écrase, contrairement à un registre.
Exemple
la t0, slot li t1, 99 sw t1, 0(t0) # memory at slot now holds 99
