Frage:
Grundlegendes zu Verzweigungsverzögerungsschlitzen zum Umkehren von MIPS
user25972
2018-10-12 20:16:10 UTC
view on stackexchange narkive permalink

Ich kehre statisch eine 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 klären möchte:

  • Verwenden alle Verzweigungs- / Sprungbefehle immer den Verzweigungsverzögerungsschlitz, sodass 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 habe ich es mit der folgenden Reihenfolge zu tun:

  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 der zweite Befehl abgerufen wird, während der erste dekodiert wird. Daher sollte die Ausführung des Verzweigungsverzögerungsschlitzes 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 anhand des alten oder des durch lb aktualisierten Registerwerts bewerten?

Danke

Sie können davon profitieren, die MIPS-Reihe von Raymond Chen hier zu lesen: [link] (https://blogs.msdn.microsoft.com/oldnewthing/20180402-00/?p=98415) Die erste Antwort lautet Nein (und siehe Link) für Details). Ich kann den zweiten nicht beantworten.
Zwei antworten:
ChrisG
2018-10-15 18:35:37 UTC
view on stackexchange narkive permalink

Der Befehl im Verzweigungsverzögerungsschlitz wird nach dem Verzweigungsbefehl (oder Sprungbefehl) 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
  • In diesem Artikel wird ausführlich auf Verzweigungsverzögerungsschlitze eingegangen.

    Wie von Igor festgestellt, 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.

    Igor Skochinsky
    2018-10-13 02:15:42 UTC
    view on stackexchange narkive permalink
    1. Es gibt Variationen von bedingten Verzweigungen, die als "Verzweigung [unter der Bedingung] wahrscheinlich" bezeichnet werden, z. B.
      • bgezl - Verzweigung größer als oder gleich Null wahrscheinlich
      • beql - Verzweigen auf gleich wahrscheinlich
    2. ol>

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

      Hinweis: Diese Anweisungen wurden in der entfernt Release 6 von MIPS Architecture. 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. Sie können dies jedoch wahrscheinlich nur bestätigen, indem Sie es auf einem tatsächlichen Prozessor ausführen.



    Diese Fragen und Antworten wurden automatisch aus der englischen Sprache übersetzt.Der ursprüngliche Inhalt ist auf stackexchange verfügbar. Wir danken ihm für die cc by-sa 4.0-Lizenz, unter der er vertrieben wird.
    Loading...