2016-12-16 1 views
0

Je me suis inscrit parce que j'ai été googler pour toujours pour une réponse à cette question et ne peux pas en trouver un.Nécessité de J contre JAL (et JR contre JALR) dans l'assemblage MIPS

Je voudrais savoir si les instructions de saut SANS liaison sont strictement nécessaires dans MIPS? J'imagine par exemple qu'utiliser les versions "AL", quand elles ne sont pas obligatoires, entraînerait une pénalité de puissance, mais y a-t-il une situation (qui n'est pas complètement artificielle ou pourrait être codée relativement simplement) où SEUL J/JR fonctionnerait?

Merci!

+4

Ils ne sont pas strictement nécessaires, mais vous devez faire attention à conserver '$ ra'. – Jester

+0

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. –

+0

C a l'instruction 'goto', qui semble fonctionner comme une instruction J. Les instructions 'break' et' continue' pourraient également avoir leur mot à dire. –

Répondre

3

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.

+0

L'émulation de 'J' /' JR' ne fonctionne pas de cette façon, puisque le flux de contrôle ne revient pas, donc le réglage de la pile n'est pas annulé par ce code. Néanmoins, +1. – EOF

+0

@EOF Oui, bien sûr! PET de cerveau. Je voulais dire quelque chose comme 1) sauver '$ ra' 2) faire les sauts avec' jal'/'jalr' 3) restaurer' $ ra'. Fixer la réponse Merci –

+1

Ouais, fondamentalement juste traiter cette fonction comme une fonction non-feuille, peu importe si elle est en fait * une * fonction feuille. – EOF