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
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.
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...
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...