Guten Abend, ich hätte eine kurze frage, auf einem mega 8 wird der stackpointer initialisiert und danach passiert das hier: ldi r31,1 ldi r30,1 ldi r16,0 push r30 ld r30,z push r30 Nach dem ersten Push steht auf dem stack eine 1. Jetzt frage ich mich was beim ld passiert. Das steht ja für eine indirekte adressierung. Ich denke, dass z standardmäßig auf r30 und r31 zeigt. (wir haben nichts an dem, auf das z zeigt verändert und eine standardeinstellung wirds da ja geben oder?) Wenn ich nun in r30 den inhalt von z lade, was steht dann in r30? r30 ist ja nunmal 8 bit breit und z 16 bit breit. z sieht meiner meinung nach so aus: r31: 0000 0001 (highbyte) und r30: 0000 0001 (low byte) Nun bin ich mir nicht sicher, was beim nächsten push auf dem stack landet. Vielleicht kann mir mal jemand helfen. Vielen Dank olli
Im Z-Register R31:R30 steht ne addresse drin, die auf irgenteinen Speicher zeigt. Bei dir 0x0101. Das, was an dieser Adresse steht, wird in R30 geladen. Danach wird der Inhalt von R30 aufn Stack getan.
Hallo, Olli schrieb: > Guten Abend, ich hätte eine kurze frage, > > auf einem mega 8 wird der stackpointer initialisiert > und danach passiert das hier: > > > ldi r31,1 > ldi r30,1 > ldi r16,0 > > push r30 > ld r30,z > push r30 > > Nach dem ersten Push steht auf dem stack eine > 1. > > Jetzt frage ich mich was beim ld passiert. > Das steht ja für eine indirekte adressierung. > Ich denke, dass z standardmäßig auf r30 und r31 zeigt. Z ist ein Symbol für das Registerpaar R30:R31. > (wir haben nichts an dem, auf das z zeigt verändert und eine > standardeinstellung wirds da ja geben oder?) Nein, Register werden beim PowerOn nicht initialisiert, sie enthalten also zufällige Werte. > > Wenn ich nun in r30 den inhalt von z lade, was steht dann in r30? Der Inhalt von Z ist ein Zeiger auf eine Speicheradresse, deren Inhalt in r30 geladen wird. > r30 ist ja nunmal 8 bit breit und z 16 bit breit. Eine Speicheradresse beim AVR ist ja auch 16Bit breit, würde ja sonst nicht passen. Dieser Zuggiff, also r30(low-Teil von Z) oder auch r31(high-Teil von Z) in r30 oder r31 zu laden, ist übrigens von Atmel nicht dafiniert, es kann also zufälliges passieren, weil ja sozusagen die Adresse während des Lesens verändert wird. Gruß aus Berlin Michael
Hi danke schonmal! Und woher weiß ich, was an dieser Adresse steht, wenn ich nur diesen Programmcode habe=?
Hi
>Und woher weiß ich, was an dieser Adresse steht, wenn ich nur diesen
Programmcode habe=?
Nirgendwoher.
MfG Spess
In der Musterlösung landet halt ne Zahl aufm stack von der ich mich frage, wie die dahin kommt...
Hallo, ich ahne ja was... ist das der komplette Code der Aufgabe? Gruß aus Berlin Michael
Studierst Du an der RWTH und fragst Dich, wieso da eine 14 auf dem Stack landet? Das folgt aus der Tatsache, dass Speicheradresse 0x0101 im Dezimalsystem 257 ist und in der Aufgabenstellung geschrieben steht, dass in jeder Speicherzelle als Wert die Quersumme ihrer Adresse steht. Quersumme(257) = 14.
Hi >In der Musterlösung landet halt ne Zahl aufm stack von der ich mich >frage, wie die dahin kommt... In diesem Fall mit 'push'. MfG Spess
Hallo Jacek, genau so ist es. Ich frage mich halt, ob der Controller das intern immer so macht oder obs jetzt nur wegen der aufgabenstellung so ist. Also eigentlich würde ja der inhalt der speicherstelle reinkopiert werden und auf den stack geladen. Das ist ja in diesem fall undefiniert. Und es ist ja auch nichts angegeben, was die quersumme berechnet?!?!
@Jacek, und direkt die nächste frage: Dann nach ret verschwinden 2 elemente vom Stack, dass liegt dann daran, dass normalerweise 2x1byte auf den stack für die rücksprungadresse gepusht werden und er durch den ret nun an diese springt?
Geh einfach blind davon aus, dass der Mikrocontroller in jeder Speicherzelle jeweils die Quersumme ihrer Adresse gespeichert ist, obwohl das in der Realität nicht der Fall ist. Denen gehts darum, dass Du völligen Blödsinn rausbekommst und die entsprechende Sprungmarke nicht erreichst, weil diese magische "14" ein paar Zeilen zum Springen benutzt wird. Ist natürlich ne super Klausur-Aufgabe um zu prüfen ob man's wirklich verstanden hat. Ich bin daran gescheitert als ich diese Klausur mal probeweise durchgerechnet habe, dass ich aufgrund eines unglaublichen Kopfrechen-Fails auf ne 12 kam, was wiederum ne Endlosschleife bewirkt hat...
Jaja, die Return-Adresse belegt zwei Schichten (zwei Bytes) auf dem Stack. Deswegen ist das so.
Das beruhigt mich ja das der S.enlightments award kandidat nr.1 auch schwierigkeiten hat ;) Vielen Dank an alle und vor allem Jacek :)
Jacek schrieb: > Denen gehts darum, dass Du völligen Blödsinn rausbekommst und die > entsprechende Sprungmarke nicht erreichst, weil diese magische "14" ein > paar Zeilen zum Springen benutzt wird. > Ist natürlich ne super Klausur-Aufgabe um zu prüfen ob man's wirklich > verstanden hat. Wollte diesen Satzbaufehler grad mal korrigieren, habe aber festgestellt dass ich nicht eingeloggt war, daher die Korrektur per Zitat: Denen geht's darum, dass Du ein paar Zeilen später die falsche Zeile beim Springen erreichst, da man nur mit der "14" sicher ankommt.
Olli schrieb: > Das beruhigt mich ja das der S.enlightments award kandidat nr.1 auch > schwierigkeiten hat ;) Habe nicht so viele Probleme mit dem Verständnis, aber ich bin ein unglaublich schlechter Kopfrechner. Btw.: Kenn ich Dich privat? Oder kennst nur Du mich und nicht andersrum? :D
Hallo, ich muß mich mal korrigieren: Michael U. schrieb: > Dieser Zuggiff, also r30(low-Teil von Z) oder auch r31(high-Teil von Z) > in r30 oder r31 zu laden, ist übrigens von Atmel nicht dafiniert, es > kann also zufälliges passieren, weil ja sozusagen die Adresse während > des Lesens verändert wird. Diese Passage ist falsch! LD r30, Z+ LD r31, Z+ LD r30, -Z LD r31, -Z nur die Varianten mit pre-decrement/post-increment sind beim AVR undefiniert. Gruß aus Berlin Michael
Ja, was heißt privat ;) Also wir haben schon mehfacht nebeneinander in der etechnik vorlesung gesessen. Ich bin ein Freund vom Keijo, trage ne brille...
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.