mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Assembler frage zu mega8


Autor: Olli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Olli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

danke schonmal!

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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

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

Nirgendwoher.

MfG Spess

Autor: Olli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm komische sache, sowas kommt in klausuren an hochschulen vor :(

Autor: Olli (Gast)
Datum:

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

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

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

Gruß aus Berlin
Michael

Autor: Jacek (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Olli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?!?!

Autor: Olli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Jacek (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Jacek (Gast)
Datum:

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

Autor: Olli (Gast)
Datum:

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


Vielen Dank an alle und vor allem Jacek :)

Autor: Jacek G. (tfc)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jacek G. (tfc)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Olli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Jacek G. (tfc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach DER! Klar. Witzig. :D

Autor: Olli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
:)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.