This post is only available in german.
Technische Informatik
In Technischer Informatik wurde heute folgende Funktion in PowerPC-Assembly gezeigt:
asm void swap(int *a, int *b)
{
lwzx r5, r0, r3
lwz r6, 0(r4)
stwx r6, r0, r3
stw r5, 0(r4)
}
Diese Funktion soll zwei Zahlen an verschiedenen Speicherstellen auslesen. Dazu lädt sie den Inhalt des Speicherbereiches dessen Adresse in Register 3 steht mit Offset 0 in das Register 5 (Zeile 1), dann den Inhalt des Speicherbereiches dessen Adresse in Register 4 steht in Register 6 (Zeile 2). Dann wird beides wieder zurück geschrieben, nur vertauscht. Nur ist dabei ein Problem: Es funktioniert nicht.
Das Problem ist die Zeile lwzx r5, r0, r3
(und die entsprechende mit stwx
). Dort steht ein r0, obwohl es einfach nur 0 sein sollte. Klingt nicht bedeutend, ist aber ein wichtiger Unterschied, denn sonst funktioniert es nicht.
Nebenbei tauchte noch die Frage auf, woher das Programm weiß, dass Daten in r3, r4 oder r5 stehen. Die Antwort darauf ging um irgendwelche Load-Phasen, die aber hier nicht auftauchten… Die tatsächliche Lösung ist ganz anders: So ist die offizielle Vereinbarung. Wer eine Funktion aufruft, hat seine Daten in die entsprechenden Register zu schreiben, per Vereinbarung. Einfach, oder?
Written on January 17th, 2008 at 09:39 am