Formaliser les commentaires dans une réponse
J
/JR
peuvent être émulés avec JAL
/JALR
que celui-ci effectue un super-ensemble des activités de l'ancienne. Comme @Jester l'a fait remarquer, les routines (fonctions dans le jargon C) doivent veiller à préserver leur adresse de retour présente dans $ra
À moins que la routine ne soit une routine feuille (une routine qui n'effectue aucun appel) $ra
doit quand même être enregistrée quelque part.
En fait, à la fois JAL
/JALR
et J
/JR
peuvent être mis en œuvre un en termes de l'autre:
Emuler JAL
/JALR
avec J
/JR
Original Emulated
jal foo la $ra, ret_label
j foo
ret_label:
Emuler J
/JR
avec JAL
/Pour que cela fonctionne, le code doit retourner à epilog
. Il est supposé que $ra
est principalement conservé dans les routines (d'où le nom des étiquettes). Un grand merci à @EOF pour avoir signalé une erreur dans cet extrait.
Comme @Peter a souligné, l'accès au $pc
conduit à une émulation de JAL
/JALR
plus facile (pour l'homme).
Comme @EOF a fait remarquer, une machine RISC ont en fait une seule instruction pour JAL
/JALR
et J
/JR
compte tenu de leur intrication innée. Considérant que les sauts et les appels arrivent très souvent dans un programme typique, être capable de les implémenter facilement (et de les exécuter rapidement) est obligatoire pour toute ISA réussie.
Ils ne sont pas strictement nécessaires, mais vous devez faire attention à conserver '$ ra'. – Jester
Si vous pouvez émuler JAL en obtenant une adresse dans '$ ra' d'une autre manière, alors vous n'en avez pas besoin. Mais je ne connais pas assez bien le MIPS pour savoir s'il y a une façon PIC de le faire. –
C a l'instruction 'goto', qui semble fonctionner comme une instruction J. Les instructions 'break' et' continue' pourraient également avoir leur mot à dire. –