Habe gerade ein program für einen AT90S8515 im Assembler und Emulator getestet. Aber der ret befehl klappt nicht, er springt immer irgendwo hin wo er nicht soll. Bin leider anfänger auf dem Atmel, woran kann das liegen? Könnte das problem am nicht festgelegten Stackpointer liegen? Kann mir das mal jemand bitte veranschaulichen. Danke
Hi! Ja, das wird am Stackpointer (SP)liegen. Dieser Pointer ist im Prinzip eine Variable. Darin enthalten ist die Adresse einer Speicherstelle. Darum sagt man, der SP "zeigt auf" diese Adresse im RAM. Wen Du nun einen call machst, wird der akutelle Wert des Befehlszeigers (eine andere Variable, die die Speicheradresse des gerade bearbeiteten Befehls enthält) an die Adresse geschrieben, auf die der SP zeigt. Danach wird der SP um eins erniedrigt. Bei dem folgenden ret - Anweisung wird der SP wieder um eins erhöht und zeigt dann also wieder auf die Speicherzelle, wo der Befehlszeiger (IP) gespeichert ist. Dieser wird anschließend zurückgelesen. Auf diese Weise "weiß" der Controller wieder, wo er weitermachen soll. Weil der SP ja bei jedem call um eins erniedrigt wird, muß man ihm ganz am Anfang auf das Ende, nicht den Anfang des RAMs setzen. Bevor man dies tut, darf man kein call verwenden! Bei den Befehlen "push" und "pop" wird übrigens der Operand an die Adresse des SP geschrieben (bzw. daher gelesen) anstatt der Wert des Befehlszeigers. Du kannst Dir diesen Speicherbereich, wo der IP bei jedem call gesichert wird, wie einen an der Decke hängenden Stapel vorstellen. Bei jedem call oder push wird was unten drangepappt, bei jedem ret oder pop was wieder abgenommen. Deswegen heißt der Speicherbereich eben "Stack", also Stapel. Sind jetzt alle Unklarheiten beseitigt?
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.