AVR Assembler-Listing, Befehl unklar

OP #4377069
Hallo Community,

brauche Hilfe, um die Wirkung eines Befehls in AVR Assembler Code 
nachzuvollziehen. Dabei handelt es sich um Befehl call. Auf den 
angefügten Listings, sieht man, dass Parameter Adresse:Wert sich durch 
das Befehl ändert und zwar wird der Wert der Adresse, auf die SP 0x11f 
zeigt 0x0a und der Wert der Adresse, auf die SP 0x11e zeigt: 0x00. Wie 
kommt das zustande? woran kann ich erkennen, dass diese Adressen 
explizit mit diesen Werte beschrieben werden? Würde mich sehr über Eure 
Hilfe freuen!
Angehängte Dateien:
Gast #4377123
Hi

>ach ok, vielen Dank! Nur verstehe ich leider noch nicht ganz, was hier
>noch die zweite Adresse 0x11e mit Wert 0x00 darstellen soll?

Der Befehl call ... steht auf Adresse 0x0008. Durch den call wird die 
Rücksprungadresse (Adresse nach dem call) auf den Stack gelegt und der 
PC auf die Adresse im call-Befehl gesetzt.

In der Spalte Adresse:Wert ist also die Rücksprungadresse auf dem Stack 
gemeint. Finde ich allerdings etwas irreführend. Besser du benutzt das 
Insruction SEt von Atmel:

https://www.google.de/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0ahUKEwjTz-605sTJAhWCHg8KHUQ_AzsQFgggMAA&url=http%3A%2F%2Fwww.atmel.com%2Fimages%2Fatmel-0856-avr-instruction-set-manual.pdf&usg=AFQjCNHZYp0mEEzU2y96F-1GdGyaDAIk0Q

MfG Spess
(Firma: CIA) #4377128
Eigentlich verstehe ich die ganze Frage nicht. CALL wird für lange 
Sprünge benutzt. Es wird die Absolute Adresse benutzt, wo hingesprungen 
wird, kein relativ Wert wie bei RCALL. Es ist also ein "Wort" notwendig. 
Ist der Sprung kurz, so ist zu erwarten das das High-Byte der Adresse 
0x00 ist.
OP #4379177
hab da auch mal Frage wegen dem Push ZH bzw ZL der SP wird nach diesem 
Befehl mit den Werten ZH: 0x01 und ZL:0x00 überschrieben. Wie sind denn 
diese Werte aus dem Code ersichtlich? Wie ist man in der Lösung auf 
genau diese Werte gekommen? würde mich sehr über eure Hilfe freuen.
Persönliche Seite #4379325
Die Musterlösung erscheint mir falsch:

Nach dem NOP steht der PC auf 0x8, und offenbar enthält der PC die 
Word-Adresse der Befehle, nicht deren Byte-Adresse.

Demnach beginnt der nächste Befehl CALL in 0x8 und belegt als 2-Word 
(32-Bit) Befehl auch 0x9.  Nach dem CALL steht der PC also auf 0xA, der 
Adresse des nachfolgenden PUSH ZH was auch korrekt in der letzten Spalte 
(Stack) eingetragen ist.  In die Spalte PC gehört also 0xA als Wert von 
PC nach dem CALL, und nach dem PUSH ZH steht der PC folglich auf 0xB 
etc.

Nach dem CALL wäre der PC nur dann 0xC, wenn PC in Bytes gerechnet wäre: 
Dann würde CALL 0x8...0xB belegen.  In dem Falle sind aber die folgenden 
PC-Werte falsch, denn jeder Befehl beginnt an einer geraden 
Byte-Adresse, und auf dem Stack müsste 0x6 stehen, nämlich die 
Word-Adresse von 0xC.
Gast #4379335
Hi

>Nach dem CALL wäre der PC nur dann 0xC

Nein. call look = call 0x000B. Das heißt nach der call ist der 
PC=0x000B. Auf Adresse 0x000A ist der PC nach dem RET.

MfG Spess

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.