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