auipc
lyszt.net couvre auipc et d'autres instructions RISC-V plus en détail.
Format d'encodage
Description
auipc signifie add upper immediate to PC. Il fonctionne comme lui, en prenant une constante de 20 bits comme partie supérieure d'une valeur. auipc ajoute cette valeur au compteur de programme, qui contient l'adresse de l'instruction en cours d'exécution (voir la page beq). Le résultat est une adresse mesurée relativement à l'endroit où cette instruction se situe en mémoire.
Les adresses relatives résolvent un vrai problème. Un programme ne sait pas toujours où il sera chargé en mémoire. Le code qui fait référence à ses données par des adresses absolues fixes échoue lorsqu'il est chargé ailleurs. Le code qui calcule les adresses relativement à l'instruction courante fonctionne partout où il est placé. Cette propriété est appelée indépendance de position.
auipc fournit la partie grossière d'une telle adresse, et une instruction suivante ajoute le reste fin de 12 bits. L'instruction la, qui charge l'adresse d'une étiquette, est construite à partir de cette paire, et il en va de même pour les appels à des fonctions distantes.
Le manuel RISC-V indique que le pc courant peut être obtenu en mettant la constante de auipc à 0. Un auipc suivi d'un jalr peut transférer le contrôle vers n'importe quelle adresse pc-relative de 32 bits, et un auipc suivi d'un chargement ou d'un stockage avec un décalage de 12 bits peut accéder à n'importe quelle adresse de données pc-relative de 32 bits.
la et call existent pour que vous n'ayez pas à écrire auipc à la main, et il apparaît souvent dans la trace du simulateur et dans le code désassemblé. Un auipc suivi d'une instruction avec un petit décalage, formant ensemble une adresse, est un motif utile à reconnaître.
Exemple
auipc t0, 1 # t0 = pc + 0x1000
