Weiterführende Frage: Berechnung der Immediates bei bedingtem Sprung

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

Weiterführende Frage: Berechnung der Immediates bei bedingtem Sprung
Guten Abend,

bei der Bearbeitung der aktuellen Hausaufgabe ist eine Frage bei mir aufgekommen, welche zwar nicht für die Hausaufgabe relevant ist, aber mich dennoch beschäftigt. Wie genau errechnen sich bei einem bedingten Sprung denn die Immediates, welche dann später durch Multiplikation mit 4 und Addition auf den Wert des Program Counters, der auf den nächsten abzuarbeitenden Befehl zeigt, die endgültige Zieladresse des Sprungziels liefern? Mir ist nicht klar, wie genau die Immediates aussehen.

jl .LCOND → das .LCond wird ja nach Regeln, welche ich nicht weiß, intern irgendwie zu einem Immediate umgewandelt. Nur wie geht das bei MIPS? Wer genau führt die Berechnung der Immediates durch?

Vielen Dank!!

Ned F.


Zur Einfachheit gehen wir mal davon aus, dass der Sprung kurz ist (also der Offset in den Immediate-Operanden passt) und der Sprung lokal ist (also nicht durch den Linker angepasst werden muss).

Ein Assemblierer kann einfach sequentiell durch das Programm gehen und jeden Assemblerbefehl in Maschinencode umwandeln. Dabei sind Label nur Namen im Assembler, die am Ende der Adresse der auf das Label folgenden Instruktion entsprechen. Kommt der Assemblierer nun zu einem Sprung, gibt es zwei Möglichkeiten:

  • Das Label verweist auf eine Instruktion, die bereits vorher assembliert wurde. Dann kann das Byte-Offset durch die Differenz der Instruktionsadressen (“Adresse Label” - “Adresse Instruktion nach Sprung”) berechnet werden (durch 4 teilen nicht vergessen)
  • Das Label verweist auf eine Instruktion, die erst später assembliert wird. Dann wird das Immediate vorübergehen beispielsweise auf 0 gesetzt. Sobald der Assembler dann an die Instruktion mit dem Label für den Sprung kommt, kann er auch hier das Offset durch die Differenz der Instruktionsadressen berechnen (“Adresse Label” - “Adresse Instruktion nach Sprung”, auch hier durch 4 teilen).

Wenn die CPU nun zu einem solchen Sprung kommt und ihn ausführt, so wird die Adresse mit 4 multipliziert auf die Adresse der nächsten Instruktion (Program Counter) addiert, womit man wieder die Adresse des Labels erhält (und durch den relativen Sprung unabhängig davon, wo im Speicher das Programm am Ende liegt).

Beantwortet das die Frage?

1 „Gefällt mir“