Grundlegendes zu Verzweigungsverzögerungsschlitzen zum Umkehren von MIPS

Ich kehre statisch einige Software um, die für einen Atheros AR7161 mit radare2 kompiliert wurde. Dieser Prozessor implementiert MIPS, und ich erinnere mich, dass MIPS einen Verzweigungsverzögerungsschlitz hat. Dies macht sich in der Tat bei der Demontage bemerkbar, da ich Anweisungen sehen kann, die logisch ausgeführt werden sollten, bevor Zweige direkt nach ihnen platziert werden.

Bei der Analyse eines Codeteils stieß ich jedoch auf eine beqz-Anweisung, für die dies angenommen wurde Die Anweisung, nachdem sie zuerst ausgeführt werden soll, ist im Kontext des Programms nicht sinnvoll. Ich muss zugeben, dass meine Analyse falsch sein könnte, was nicht unwahrscheinlich ist; Ich habe jedoch einige Zweifel, die ich auch gerne klären möchte:

  • Verwenden alle Verzweigungs- / Sprungbefehle immer den Verzweigungsverzögerungsschlitz, so dass der Befehl direkt danach zuerst logisch ausgeführt werden sollte Wenn nicht, in welchen Fällen würde dies nicht der Fall sein?

  • Gibt es eine Möglichkeit, radare2 die logische Ausführungsreihenfolge anstelle der in der Binärdatei codierten Reihenfolge anzeigen zu lassen?

Bearbeiten : Konkret handelt es sich um die folgende Sequenz:

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

Ich habe ein sehr diffuses Bild in meinem Kopf über diese Anweisung, die in die Pipeline geht. Ich kann mir vorstellen, wie die zweite Anweisung abgerufen wird, während die erste dekodiert wird Die Ausführung des Verzweigungsverzögerungsschlitzes sollte tatsächlich beginnen. Der Verzweigungsbefehl hängt jedoch davon ab, dass dasselbe Register durch den Befehl im Verzweigungsverzögerungsschlitz geändert wird. Was wird also passieren? Wird der Verzweigungsbefehl den Zustand unter Verwendung des alten Registers va bewerten lue oder die neue, die von lb aktualisiert wurde?

Danke

Kommentare

  • Sie könnten davon profitieren, die MIPS-Serie von zu lesen Raymond Chen hier: Link Die erste Antwort lautet Nein (und siehe Link für Details). Ich kann ' die zweite nicht beantworten.

Antwort

Der Befehl im Verzweigungsverzögerungsschlitz wird nach dem Verzweigungs- (oder Sprung-) Befehl ausgewertet. Die Ausführung des Befehls im Verzweigungsverzögerungsschlitz hat keinen Einfluss auf die Bewertung des Verzweigungszustands.

Ich habe beobachtet, dass der Verzweigungsverzögerungsschlitz für einige Dinge verwendet wird:

  • Der letzte Befehl des Basisblocks, der zum Verzweigungsbefehl führt
    • Der Verzweigungstest hängt nicht von der Ausgabe der Berechnung des Verzweigungsverzögerungsschlitzbefehls ab.
    • Wird häufig bei bedingungslosen Sprüngen / Verzweigungen beobachtet wie b, jal
  • Die erste Anweisung des Fall-Through-Blocks .
    • Es sollten keine Nebenwirkungen auftreten, wenn der Zweig genommen wird.
    • Die Analyse zeigt, dass keine betroffenen Register erforderlich sind, falls der Zweig genommen wird
  • Die erste Anweisung des Blocks, wenn die Verzweigung ausgeführt wird
    • Wenn mehrere Pfade zum Verzweigungsziel vorhanden sind, wird diese Anweisung wahrscheinlich mehrmals mit den verschiedenen Verzweigungen
    • Das Laden eines bedingten Werts, häufig für Rückgabewerte

    Dieser Artikel geht detailliert auf Verzweigungsverzögerungsschlitze ein.

    Wie von Igor bemerkt, behält die „wahrscheinliche“ Version des Verzweigungsbefehls die Auswirkungen des Befehls nur dann im Verzweigungsverzögerungsschlitz bei, wenn der Befehl tatsächlich ausgeführt wird.

  • Antwort

    1. Es gibt Variationen von bedingten Zweigen, die als „Zweig [unter der Bedingung] wahrscheinlich“ bezeichnet werden, z
      • bgezl – Verzweigen auf größer als oder gleich Null wahrscheinlich
      • beql – Verzweigen auf Gleich wahrscheinlich

    Diese Befehle haben einen Verzögerungsschlitz, aber der Befehl im Verzögerungsschlitz wird nur wenn der Zweig genommen wird. Wenn die Verzweigung nicht genommen wird, wird der Befehl im Verzögerungsschlitz nicht ausgeführt ( nullified ).

    Hinweis: Diese Anweisungen wurden in Version 6 der MIPS-Architektur entfernt. Es wurden auch kompakte Variationen von Zweigen hinzugefügt, die keine Verzögerungssteckplätze haben.

    Was Ihr Snippet betrifft, vermute ich stark, dass der Zweig den alten Registerwert verwendet, aber Sie können ihn wahrscheinlich bestätigen Nur durch Ausführen auf einem tatsächlichen Prozessor.

    Schreibe einen Kommentar

    Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.