Forum: Mikrocontroller und Digitale Elektronik AVR Assembler-Listing, Befehl unklar


von Florian S. (sirius7)


Angehängte Dateien:

Lesenswert?

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!

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

call legt die Rücksprungadresse auf den Stack, damit ret weiß, wohin 
es zurückspringen soll.

von Florian S. (sirius7)


Lesenswert?

Rufus Τ. F. schrieb:
> call legt die Rücksprungadresse auf den Stack, damit ret weiß, wohin
> es zurückspringen soll.

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

von spess53 (Gast)


Lesenswert?

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

von Thomas H. (Firma: CIA) (apostel13)


Lesenswert?

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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Alex S. schrieb:
> Nur verstehe ich leider noch nicht ganz, was hier noch die zweite
> Adresse 0x11e mit Wert 0x00 darstellen soll?

16-Bit-Adresse?

von Klaus (Gast)


Lesenswert?

@  Alex

Darf ich mal fragen, wie Du die Tabelle assli2.JPG erstellt hast?

von Florian S. (sirius7)


Lesenswert?

Klaus schrieb:
> @  Alex
>
> Darf ich mal fragen, wie Du die Tabelle assli2.JPG erstellt hast?

Hallo Klaus, die war uns vorgegeben, das ist eine Aufgabe, mit der ich 
mich momentan rum schlage. Assli2 ist halt die Musterlösung. Gruß

von Florian S. (sirius7)


Lesenswert?

Rufus Τ. F. schrieb:

> 16-Bit-Adresse?

achso, 0x011e beinhaltet das High-Byte der Adresse. Ok ist mir jetzt 
klar. Vielen Dank!

von Florian S. (sirius7)


Lesenswert?

Thomas H. schrieb:

> Ist der Sprung kurz, so ist zu erwarten das das High-Byte der Adresse
> 0x00 ist.

super! vielen Dank für die Erklärung, Ihr habt mir sehr weitergeholfen!

von Florian S. (sirius7)


Lesenswert?

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.

von spess53 (Gast)


Lesenswert?

Hi

> Wie sind denn diese Werte aus dem Code ersichtlich?

Garnicht, denn es gibt in dem gezeigten Code keine Zuweisung für ZL/ZH.

MfG Spess

von Florian S. (sirius7)


Lesenswert?

ah ok, ich habs, also Z Register ist ja gegeben 0x0100 dann sind ja Zh = 
0x01 und zl = 0x00

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

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.

von spess53 (Gast)


Lesenswert?

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

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Ah, mein Fehler.  Bin davon ausgegangen "assli" stünde für 
"Assembler-Listing".

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.