Forum: Mikrocontroller und Digitale Elektronik Assembler frage zu mega8


von Olli (Gast)


Lesenswert?

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

von Martin (Gast)


Lesenswert?

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.

von Michael U. (amiga)


Lesenswert?

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

von Olli (Gast)


Lesenswert?

Hi

danke schonmal!

Und woher weiß ich, was an dieser Adresse steht, wenn ich nur diesen 
Programmcode habe=?

von spess53 (Gast)


Lesenswert?

Hi

>Und woher weiß ich, was an dieser Adresse steht, wenn ich nur diesen
Programmcode habe=?

Nirgendwoher.

MfG Spess

von Olli (Gast)


Lesenswert?

Hmm komische sache, sowas kommt in klausuren an hochschulen vor :(

von Olli (Gast)


Lesenswert?

In der Musterlösung landet halt ne Zahl aufm stack von der ich mich 
frage, wie die dahin kommt...

von Michael U. (amiga)


Lesenswert?

Hallo,

ich ahne ja was... ist das der komplette Code der Aufgabe?

Gruß aus Berlin
Michael

von Jacek (Gast)


Lesenswert?

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.

von spess53 (Gast)


Lesenswert?

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

von Olli (Gast)


Lesenswert?

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?!?!

von Olli (Gast)


Lesenswert?

@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?

von Jacek (Gast)


Lesenswert?

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

von Jacek (Gast)


Lesenswert?

Jaja, die Return-Adresse belegt zwei Schichten (zwei Bytes) auf dem 
Stack. Deswegen ist das so.

von Olli (Gast)


Lesenswert?

Das beruhigt mich ja das der S.enlightments award kandidat nr.1 auch 
schwierigkeiten hat ;)


Vielen Dank an alle und vor allem Jacek :)

von Jacek G. (tfc)


Lesenswert?

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.

von Jacek G. (tfc)


Lesenswert?

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

von Michael U. (amiga)


Lesenswert?

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

von Olli (Gast)


Lesenswert?

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

von Jacek G. (tfc)


Lesenswert?

Ach DER! Klar. Witzig. :D

von Olli (Gast)


Lesenswert?

:)

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
Noch kein Account? Hier anmelden.