Frage Assembeler

OP #5881132
Lesenswert?

Hallo alle zusammen kann mir jemand nur bitte erklären wie die hier in 
der Tabelle 0x0123 kommen ?
Ganz am Ende des Bildes ?
Ich verstehe es einfach nicht.

Bitte um Erklärung
#5881155
Lesenswert?

Na Du siehst doch das ZL und ZH verändert wurden, zusammen ergeben sie 
das 16-Bit bereite Z Register.

Und in die Adresse, auf die das Z-Register zeigt (das nennt man dann 
indirekte Adressierung, wie der Vorschreiber schon anmerkte) wird dann 
der Inhalt von r17 geschrieben (0x30).

Danach wird der Zeiger, also der Inhalt des Z-Registers, noch um 1 
erhöht (wg. des "+" nach dem Z im Code).
#5881469
Lesenswert?

Hi
nun, so schwer ist das nicht. Wie bereits von Michael geschrieben, alle 
Befehle nachgehen. Zuerst wird die Rücksprungadresse im Speicher auf dem 
Stack und anschließend das Registerpaar ZH:ZL sowie R16 und R17 im 
Unterprogramm mit Push ab der höchsten Speicheradresse abwärts 
gesichert. Betrachte mal den PC (Programmcounter) und den SP 
(Stackpointer) Der Stackpointer zeigt auf den Speicher und schreibt dort 
die Inhalte der Register. Sa kannst du erkennen, wenn du die Inhalte der 
Register vor dem Aufruf mit der Ablage auf dem Stack vergleichst. Das 
R17 Register wird gelöscht und eine Addition mit Übertrag von R16 auf ZL 
und ÜBertrag + R17 (in diesem Fall 0) durchgeführt. Also ZL hatte 20 
(hex !) + R16 mit Inhalt 3 (hex !) ergibt 23. keinen Übertrag. ZH hatte 
01 (hex !)+ 0 bleibt bei 01 (hex !). Zusammen sind es dann 0123 (hex !)
alles klar?
Gruß oldmax
Gast #5881778
Lesenswert?

Jan K. schrieb:
> Wie kommen die hier auf das 0xffe und den Kram auf der rechten Seite ?

Das Problem ist, dir fehlen die absoluten Grundlagen der 
Assembler-Programmierung (was ist ein Stackpointer..).

Die solltest du dir aneignen, anstatt in einem Forum deinen Hausaufgaben 
erledigen zu lassen.
Moderator #5881977
Lesenswert?

Jan K. schrieb:
> Ich wollte nur wissen wie die auf die Lösung kommen ?

Die haben in der AVR-Dokumentation (bspw. auf der in meinem letzten
Beitrag verlinkten Webseite) nachgeschaut und daraus ihre Schlüsse
gezogen.

> Kann mir das jemand erklären?

Die obige Webseite kann das, du musst sie nur aufmerksam durchlesen.
Mehr als das, was dort steht, weiß ich zu diesem Thema auch nicht,
trotzdem fällt es mir nicht schwer, die Registerinhalte in der
Aufgabenstellung nachzuvollziehen. Vielleicht helfen dir ja die
in die Aufgabe eingezeichneten Informationsflüsse auf die Sprünge.
Angehängte Dateien:
Moderator #5882031
Lesenswert?

Gibt es denn irgendeine ganz kleine Kleinigkeit, von der du dir
vorstellen könntest, sie verstanden zu haben?

Oder hast du wenigstens die Begriffe Program-Counter, Stack-Pointer usw.
schon einmal gehört, bevor du diese Aufgabe vorgelegt bekommen hast?

Immer wieder nach einer Erklärung zu fragen, ohne dabei den Eindruck zu
vermitteln, selber aktiv mitzudenken, mutet fast schon etwas trollisch
an.
#5882046
Lesenswert?

Hi
Da werden wir lange versuchen können, Dr die Vorgänge in einem Prozessor 
zu erklären, wenn du erstens nicht dazu stehst, das es Tel eines 
Unterrichtes ist. Ob Hausaufgabe oder nicht, Hilfe zum Verständnis gebe 
ich und auch andere gern. Nur es muss schon erkennbar sein, des es Dann 
macht. Wer auch immer Dr das vorgelegt hat, ist der Ansicht, das PC, SP, 
Adressen und Speicherinhalte bekannt sind. Der Aufruf eines 
Unterprogramms lässt nach Abarbeitung wieder das Programm nach dem CALL 
Befehl fortsetzen und dazu muss der Programmcounter wissen, wo das war. 
Also wird eben den Adresse nach dem CALL auf den Stack geschrieben und 
be dem Befehl RET wieder in den PC geschrieben. Also, der Fall schreibt 
den Wert vom PC auf die Speicherzellen, die von oben nach unten 
adressiert werden. Dann wird der PC mit der Adresse des Unterprogramms 
geladen und dort der näch Befehl geholt. Mit dem Befehl RET wird dann 
wieder der Wert aus den Speicherzellen  die durch den SP adressiert sind 
in den PC geschrieben. Dabei wird hat der SP wieder hochgezählt.. Die 
Tabelle ist nun mit den Werten von SP, PC und den Inhalten der durch den 
SP adressierten Specherzellen beschrieben. Wenn du den einzelnen 
Schritten folgst, wirst du die Lösung finden. Vielleicht noch eine kurze 
Bemerkung, der PC adressiert einen Befehl, der Controller lädt den 
Befehl und setzt den PC auf die nächste Adresse im Programmspeicher.
Gruß oldmax
Moderator #5882054
Lesenswert?

Jan K. schrieb:
> Ich habe nur das mit dem 0x1000 verstanden .
> Man hat den Ihnhalt vom Sp geholt .
> Mehr verstehe ich nicht.

Das ist nicht viel.

D.h. du weißt nicht, wozu der Stack gut ist, was der CALL-Befehl tut,
was eine Speicheradresse ist?

Möchtest du jetzt, dass dir jemand eine ausführliche Einführung in das
Thema Mikroprozessoren gibt, und zwar von null an? Denn ohne jegliches
Grundlagenwissen wirst du die Lösung der Aufgabe nie verstehen können.
Es wird auch niemand die Laplace-Transformation verstehen, ohne vorher
die Grundrechenarten (und noch viel, viel mehr) gelernt zu haben.

Was bewegt dich denn überhaupt dazu, diese Aufgabe zu lösen, und wo
kommt die Aufgabe her? Du schreibst oben, es handle sich nicht um eine
Hausaufgabe. Ich habe auch nicht das Gefühl, dass das Thema für dich
Bestandteil einer Ausbildung oder eines Studiums ist.
Moderator #5882055
Lesenswert?

c-hater schrieb:
> Yalu X. schrieb:
>
>> Immer wieder nach einer Erklärung zu fragen, ohne dabei den Eindruck zu
>> vermitteln, selber aktiv mitzudenken, mutet fast schon etwas trollisch
>> an.
>
> Das hast du erst an diesem Punkt bemerkt?

Naja, er verhält sich nicht ganz genau so wie du, deswegen bin ich mir
noch etwas unsicher ;-)
Gast #5882062
Lesenswert?

Jan K. schrieb:
> Wie kommen die hier auf das 0xffe und den Kram auf der rechten Seite ?
> :)

Nun SP steht für STACKPOINTER und PC steht für PROGRAMMCOUNTER der eher 
BEFEHLSCOUNTER heißen müsste, da hier nur ausgeführte Befehle gezählt 
werden.

Der SP ist ein Bereich im SRAM-Speicher der bewusst ans Ende gelegt 
wurde. Sobald der SP initalisiert wird mit

ldi   R16,high(RAMEND)
ldi   R17,low (RAMEND)
out   sph,r16
out   spl,r17

kann mit den Befehlen LCALL/SCALL/RCALL/CALL/RET/RETI/PUSH/POP, Achtung 
Plattform beachten, gearbeitet werden. Werden diese Befehle ohne 
vorherige Initalisierung des SP genutzt stürzt dein PROGRAMM ab, sprich 
er springt ins NIRVANA und führt ein Programmteil aus der gar nicht 
ausgeführt werden soll!!!!!

Nun der SP arbeitet quasi von unten, sprich von letzter RAM-Adresse, 
nach oben. BSP

$0123  call   Programm
$0124  nop
$0125  nop
.
.
.
.

LABEL   Programm
$5665   SBI    Portx,PINy
$5666   ret

Wird der Befehl CALL aufgerufen wird gleichzeitig die Adresse $1234 auf 
den STACK abgelegt zb letzte Adresse im RAM $01ff.
01 = $12 (ZH)
ff = $34 (ZL)

Danach wird das aufgerufene Programm abgearbeitet,
bis der Befehl RET(RETURN = ZURÜCK von wo du kamst) erreicht wird.
Nun wird der Inhalt = $0123 der letzten RAM-Adresse $01ff wieder in das 
STACKPOINTERREGISTER zurückgeschrieben und gdanch ebenfalls diese 
ADRESSE+1 angesprungen.

Das Programm wird an $0124 fortgesetzt.

Bei INIT muss nicht zwangsläufig RAMEND genutzt werden, es kann RAMEND 
auch eine andere Adresse im RAM genutzt werden. Problem ist das man aber 
kaum weis wieviele Unterprogrammen aufgerufen werden innerhalb eines 
Unterprgrammes eine Unterprgrammes eines.. nterprogrammes.........

Jetzt guckst du mal in den LINK und suchst das RAMEND und meldest mal 
die ZAHL 
zurück.https://github.com/DarkSector/AVR/blob/master/asm/include/m8def.inc

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren