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
Kannst du bisschen erklären wie die darauf kommen ? Ich möchte es nur verstehen . Ist keine Hausaufgabe oder so
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.
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?
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).
Habe die einfach das 0x0 und das 0x23 zusammengefügt? und daraus 0x023 gemacht ? Einfach die 0 dran gehängt ?
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/
Sehe keine 0, welche mit einer 23 zusammengefügt werden. Ich sehe nur ein Registerpaar, welches man für die indirekte Adressierung nutzen kann.
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
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
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
Moin, Die 2 groessten Probleme sind: Du hast keine Ahnung, was die Befehle bewirken und du kannst nicht mal Assembler richtig schreiben. SCNR, WK
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.
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 |
Die Lösung habe ich doch bereits . Ich wollte nur wissen wie die auf die Lösung kommen ? Kann mir das jemand erklären?
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.
Ich habe es mir angeschaut ,aber konnte es irgendwie gar nicht nachvollziehen . Schade . Aber wäre schön trotzdem wenn jemand erklären will?
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.
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
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?
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
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.
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 ;-)
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.