call
pseudolyszt.net couvre call et d'autres instructions RISC-V plus en détail.
Description
call exécute une fonction et gère le retour. Elle saute vers la fonction et stocke l'adresse de retour dans ra, ce qui permet à la fonction de revenir. C'est une pseudo-instruction qui se développe généralement en l'instruction ci-dessous.
jal ra, label
Lorsqu'une fonction se trouve trop loin pour qu'un seul saut puisse l'atteindre, l'assembleur substitue une séquence plus longue qui couvre la distance. Écrire call avec le nom de la fonction exprime l'intention et laisse le choix de la forme à l'assembleur. L'entrée jal décrit le saut et la sauvegarde de l'adresse de retour. La ligne ci-dessous appelle la fonction square.
call square
Appeler une fonction nécessite aussi un accord sur la manière dont les informations circulent entre l'appelant et l'appelé. Cet accord est la convention d'appel. L'appelant place les entrées de la fonction dans les registres d'arguments, nommés a0, a1 et ainsi de suite, et lit le résultat dans a0 une fois la fonction revenue. Les deux parties suivent la même règle, de sorte que du code écrit séparément fonctionne toujours ensemble.
Chaque call écrase ra. Une fonction qui effectue ses propres appels sauvegarde le ra qu'elle a reçu avant de les effectuer, puis restaure cette valeur avant son propre retour. Sans cela, l'adresse de retour de l'appel interne remplace celle de l'appel externe et la fonction ne peut pas revenir. Une fonction qui n'appelle rien d'autre n'a pas besoin de sauvegarder ra.
Le manuel RISC-V indique que la convention d'appel logicielle standard utilise x1 comme registre d'adresse de retour. Un jal atteint des cibles dans une plage de plus ou moins 1 MiB, où un MiB vaut 1 048 576 octets. Une cible plus éloignée nécessite un auipc suivi d'un jalr, qui atteint n'importe quel endroit dans une plage d'adresses relatives au pc de 32 bits.
L'exemple appelle square avec 6 dans a0 et trouve 36 dans a0 ensuite. L'argument entre et le résultat sort par la convention.
Se développe en
jal ra, label
L'assembleur remplace cette pseudo-instruction par la ou les instructions réelles listées ci-dessus.
Exemple
call square # jumps to square; ra holds the return address
Références
- [1]RISC-V International. The RISC-V Instruction Set Manual, Volume I: Unprivileged Architecture. Version 20260120. Section 2.5.1, Unconditional Jumps, page 30.
- [2]RISC-V International. The RISC-V Instruction Set Manual, Volume I: Unprivileged Architecture. Version 20260120. Section 2.4.1, Integer Register-Immediate Instructions, pages 28 to 29.
