Comprendre les créneaux de délai de branchement pour inverser MIPS

Jinverse statiquement certains logiciels compilés pour un Atheros AR7161 utilisant radare2. Ce processeur implémente MIPS, et je rappelle que MIPS a un slot de retard de branche. Cest en effet perceptible lors du démontage car je peux voir des instructions qui devraient logiquement sexécuter avant que les branches ne soient placées juste après elles.

Cependant, en analysant un morceau de code, je suis tombé sur une instruction beqz pour laquelle en supposant que linstruction après quelle doit sexécuter en premier na pas de sens dans le contexte du programme. Je dois admettre que mon analyse pourrait être erronée, ce qui nest pas improbable; cependant, j’ai quelques doutes sur le fait que j « aimerais aussi effacer:

  • Toutes les instructions de branchement / saut utilisent toujours le slot de retard de branchement de telle sorte que l’instruction juste après devrait être exécutée en premier logiquement ? Sinon, dans quels cas ne le serait-il pas?

  • Y a-t-il un moyen de faire en sorte que radare2 affiche lordre dexécution logique plutôt que celui encodé dans le binaire?

Edit : concrètement, je traite de la séquence suivante:

beqz v0, <some address> lb v0, 0x40(sp) 

Jai une image très diffuse dans ma tête de ces instructions entrant dans le pipeline. Je peux imaginer que la deuxième instruction est récupérée pendant que la première est en cours de décodage; doù , lexécution du créneau de délai de branchement devrait effectivement commencer. Cependant, linstruction de branchement dépend du fait que le même registre est modifié par linstruction dans le créneau de retard de branchement, alors que va-t-il se passer? Linstruction de branchement évaluera-t-elle la condition en utilisant lancien registre va lue, ou le nouveau mis à jour par lb?

Merci

Commentaires

  • Vous pourriez bénéficier de la lecture de la série MIPS en Raymond Chen ici: lien La première réponse est non (et voir le lien pour plus de détails). Je ne peux ' répondre à la seconde.

Réponse

Linstruction dans le créneau de délai de branchement est évaluée après linstruction de branchement (ou de saut). Lexécution de linstruction dans le créneau de délai de branchement na pas dimpact sur lévaluation de la condition de branchement.

Jai observé que le créneau de délai de branchement est utilisé pour plusieurs choses:

  • Dernière instruction du bloc de base menant à linstruction de branchement
    • Le test de branchement ne dépendra pas de la sortie du calcul de linstruction de créneau de retard de branchement
    • Généralement vu avec les sauts / branchements inconditionnels comme b, jal
  • La première instruction du bloc de passage .
    • Aucun effet secondaire ne devrait être présent si la branche est prise.
    • Lanalyse montrera que les registres impactés ne sont pas nécessaires dans le cas où la branche est prise
  • La première instruction du bloc si la branche est prise
    • Sil y a plusieurs chemins vers la cible de la branche, cette instruction sera probablement vue plusieurs fois avec les différentes branches
  • Le chargement dune valeur conditionnelle, souvent pour les valeurs de retour

Cet article va dans les détails sur les créneaux de délai de branchement.

Comme noté par Igor, la version « probable » de linstruction de branchement conserve les effets de linstruction dans le créneau de délai de branchement uniquement si linstruction est effectivement prise.

Réponse

  1. Il existe des variantes de branches conditionnelles appelées « branche [sous condition] probable », par exemple
    • bgezl – Branchement sur supérieur ou égal à zéro probable
    • beql – Branchement sur Égal probable

Ces instructions ont un créneau de délai mais linstruction dans le créneau de délai est exécutée uniquement si la branche est prise. Si le branchement nest pas pris, linstruction dans le créneau de délai est pas exécutée ( annulée ) .

NB: ces instructions ont été supprimées dans la version 6 de MIPS Architecture. Il a également ajouté des variantes compactes de branches qui nont pas de créneaux temporels

Quant à votre extrait de code, je soupçonne fortement que la branche utilise la valeur de registre ancienne , mais vous pouvez probablement le confirmer uniquement en lexécutant sur un processeur réel.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *