Forum: Mikrocontroller und Digitale Elektronik Frage Assembeler


von Jan K. (tester33)



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

von Einer K. (Gast)


Lesenswert?

Das ist der Erfolg einer indirekten Adressierung

von Jan K. (tester33)


Lesenswert?

Kannst du bisschen erklären wie die darauf kommen ?
Ich möchte es nur verstehen . Ist keine Hausaufgabe oder so

von Einer K. (Gast)


Lesenswert?

Was gibts da zu sagen...

ZH und ZL werden so manipuliert, dass hinterher in Z die 0x0123 
drinstehen.
Dann wird die 0x30 an diese Adresse geschrieben und Z inkrementiert.

von Jan K. (tester33)


Lesenswert?

Woher komme ich denn drauf das da 0x0123 rein kommt ?
Die müssen ja irgendwie das berechnet haben oder wie auch immer ?
Ich verstehe nur nicht wie die auf die 0x0123 kommen?

von Markus M. (adrock)


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

von Jan K. (tester33)


Lesenswert?

Habe die einfach das 0x0 und das 0x23 zusammengefügt?

und daraus 0x023 gemacht ?
Einfach die 0 dran gehängt ?

von Einer K. (Gast)


Lesenswert?

Jan K. schrieb:
> Habe die einfach das 0x0 und das 0x23 zusammengefügt?

Z besteht aus ZH und HL
Die beiden 8Bit Register sind zu einem 16Bit Register zusammen gefasst.
Du kannst/musst sie einzeln manipulieren und gemeinsam als Adresse 
nutzen.

Lesen: https://mezdata.de/avr/120_indirektes-adr/

von Jan K. (tester33)


Lesenswert?

also einfach die 0 genommen und mit dem23 zusammengefügt ja?

von Einer K. (Gast)


Lesenswert?

Sehe keine 0, welche mit einer 23 zusammengefügt werden.

Ich sehe nur ein Registerpaar, welches man für die indirekte 
Adressierung nutzen kann.

von Jan K. (tester33)


Lesenswert?

ok danke

von Michael U. (amiga)


Lesenswert?

Hallo,

Du brauchst Doch nur die Tabelle schrittweise durchgehen und schauen, 
welche Register durch welche Befehle geändert werden.
Dann ist völlig klar, daß in ZH/ZL 0x123 steht wenn geschreiben wird, 
also zeigt es genau auf diese Adresse.

Gruß aus Berlin
Michael

von Martin V. (oldmax)


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

von Jan K. (tester33)


Lesenswert?

ja danke

von Jan K. (tester33)



Lesenswert?

Hallo alle zusammen habe hier auch gerade wieder ein Problem die 
Musterlösung zu verstehen .


Wie kommen die hier auf das 0xffe und den Kram auf der rechten Seite ? 
:)

Ich verstehe es gerade überhaupt nicht .
Wäre für eine Erklärung dankbar

von Junge (Gast)


Lesenswert?

Warum ein zweiter thread?

von Jan K. (tester33)


Lesenswert?

Ist eine andere Aufgabe

von Dergute W. (derguteweka)


Lesenswert?

Moin,

Die 2  groessten Probleme sind: Du hast keine Ahnung, was die Befehle 
bewirken und du kannst nicht mal Assembler richtig schreiben.

SCNR,
WK

von olibert (Gast)


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.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Hier werden alle deine aktuellen und zukünftigen Fragen zur Assembler-
Programmierung des AVR beantwortet:

  https://www.microchip.com/webdoc/avrassembler/avrassembler.wb_instruction_list.html

Klickst du auf CALL, erfährst du, was dieser Befehl mit dem Stack-
Pointer (SP) anstellt, nämlich

1
SP ← SP-2

von Jan K. (tester33)


Lesenswert?

Die Lösung habe ich doch bereits .
Ich wollte nur wissen wie die auf die Lösung kommen ?
Kann mir das jemand erklären?

von Yalu X. (yalu) (Moderator)


Angehängte Dateien:

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.

von Jan K. (tester33)


Lesenswert?

Ich habe es mir angeschaut ,aber konnte es irgendwie gar nicht 
nachvollziehen .
Schade .
Aber wäre schön trotzdem wenn jemand erklären will?

von Yalu X. (yalu) (Moderator)


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.

von Jan K. (tester33)


Lesenswert?

Ich habe nur das mit dem 0x1000 verstanden .
Man hat den Ihnhalt vom Sp geholt .
Mehr verstehe ich nicht.
Sonst hätte ich die Aufgabe nicht gepostet

von Einer K. (Gast)


Lesenswert?

Jan K. schrieb:
> Mehr verstehe ich nicht.

Dann nimm dir Statement für Statement vor!

von c-hater (Gast)


Lesenswert?

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?

von Martin V. (oldmax)


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

von Yalu X. (yalu) (Moderator)


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.

von Yalu X. (yalu) (Moderator)


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 ;-)

von chris (Gast)


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

von c-hater (Gast)


Lesenswert?

Yalu X. schrieb:

> Naja, er verhält sich nicht ganz genau so wie du, deswegen bin ich mir
> noch etwas unsicher ;-)

Nun, scheinbar weichen unsere Definitionen von dem, was ein Troll ist, 
doch ganz erheblich voneinander ab...

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.