Forum: Mikrocontroller und Digitale Elektronik Assembler Aufgabe Erklärung


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Hammer V. (mad33)


Angehängte Dateien:

Bewertung
-1 lesenswert
nicht lesenswert
Wie kommen die auf diese Call Func Lösung in der Reihe?

0x0ffe         0x1000
0x0fff
0x1c
0x00

Kann mir das jemand erklären ?

: Bearbeitet durch User
von Jens M. (schuchkleisser)


Bewertung
1 lesenswert
nicht lesenswert
Schau dir an was Call macht, dann kommst du drauf.

Zum Thema Hausaufgaben: Wo ist dein Problem? Stell definitive Fragen, 
dann bekommst du Antworten. Die vollständige Lösung gibt dir keiner, 
hoffe ich, denn dann müsste der auch die Note bekommen.

Beitrag #6350179 wurde von einem Moderator gelöscht.
von S. Landolt (Gast)


Angehängte Dateien:

Bewertung
-1 lesenswert
nicht lesenswert
Das war jetzt einfach.

von Martin V. (oldmax)


Bewertung
-1 lesenswert
nicht lesenswert
Hi
Die Frage ist gar nicht so unbegründet. Meines Wissens wird bei einem 
Call- Befehl der Programmcounter auf den Stack geschrieben und soweit 
ich weiß, ist das bereits die Adresse nach dem Call. Hier aber wird die 
Adresse des Call auf den Stack gelegt. Das bedeutet aber, das bei einem 
Ret wieder die Adresse des Call im Programmcounter landet. Sicher bin 
ich mir nicht so ganz, wann der PC erhöht wird, aber ich meine, sofort 
nach dem Einlesen des Befehls und vor seiner Ausführung. Ansonsten ist 
klar, es ist die Adresse des Call.
Gruß oldmax

von S. Landolt (Gast)


Bewertung
0 lesenswert
nicht lesenswert
> Hier aber wird die Adresse des Call auf den Stack gelegt.

Verstehe ich nicht - der call liegt auf 1a, also ist die Folgeadresse 
1c, und genau das steht laut Tabelle im Stack.

von Martin V. (oldmax)


Bewertung
0 lesenswert
nicht lesenswert
Hi


S. Landolt schrieb:
> Verstehe ich nicht - der call liegt auf 1a, also ist die Folgeadresse
> 1c, und genau das steht laut Tabelle im Stack.
Soweit hast du recht, wenn da nicht stehen würde Adresse nach CALL 1E !
Also  muß noch ein Befehl fehlen, denn erst nach einem weiteren, der auf 
1A steht kann 1C folgen. Der Call steht demnach auf 1C, und ich meine, 
der PC hat sofort nach dem Einlesen noch vor der Befehlsausführung die 
nächste Adresse, und die sollte dann auch auf dem Stack stehen.
gruß oldmax

: Bearbeitet durch User
von S. Landolt (Gast)


Bewertung
0 lesenswert
nicht lesenswert
(ich dreh' mich einmal um, und plötzlich steht was anderes da)

> Adresse nach CALL 1E
Das liegt wohl an dem 'On-chip Debug system'- break; aber damit habe 
ich selbst noch nie gearbeitet.

von S. Landolt (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Quatsch - natürlich 1e, dorthin springt ja der call !

von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Bewertung
-1 lesenswert
nicht lesenswert
Wenn das wirklich 'ne umfangreiche Hausaufgabe ist ... aber selbst wenn 
ich von Assembler keine Ahnung habe, habe ich das innerhalb einer Stunde 
durch einen passenden Simulator gejagt.

Sieht irgendwie aus wie AVR-Assembler.

von Martin V. (oldmax)


Bewertung
0 lesenswert
nicht lesenswert
Hi
S. Landolt schrieb:
> Quatsch - natürlich 1e, dorthin springt ja der call !

Jo, da hast du recht. Aber wie auch immer, sehr verwirrend, da bin auch 
ich mal wieder drauf reingefallen, eine "Func" mitten im Programm, ächt 
ätzend..
Gruß oldmax

von S. Landolt (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Immerhin haben wir jetzt eine Diskussion, an der sich dann auch Hammer 
V. beteiligen kann - eine pauschale Lösung wird er wohl nicht bekommen, 
dazu wäre das komplette Ausfüllen auch für einen Willigen doch zu viel 
Arbeit.

von Jens M. (schuchkleisser)


Bewertung
0 lesenswert
nicht lesenswert
Ben B. schrieb:
> selbst wenn
> ich von Assembler keine Ahnung habe, habe ich das innerhalb einer Stunde
> durch einen passenden Simulator gejagt.

Arm, wenn man eine Stunde braucht, um eine Zeile Code aus einem 
Papierlisting zu simulieren, wenn 1 Minute hinschauen reicht.
Da steht exakt was passiert, und wenn man auch nur im Ansatz versteht 
was call macht (im übrigen völlig unabhängig der nicht genannten 
Architektur), dann kann man doch sehen was da passiert, aund auch warum.

Es fehlt OP nur am Leseverständnis. Einfach die Tabellenkopfzeile und 
die fragliche Zeile zusammen mit der ersten nochmal genau durchlesen, 
dann sollte es klappen.

von Karl B. (gustav)


Bewertung
0 lesenswert
nicht lesenswert
Hammer V. schrieb:
> Wie kommen die auf diese Call Func Lösung in der Reihe?

Der SP wird rückwärts gezählt.
Entsprechend verringert sich die Adresse am SP:

Mach doch nen Test.
Nim statt call   (4 Byte Befehl)
rcall (2 Byte)
und guck mal.

ciao
gustav

von S. Landolt (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
Karl B. schrieb:
> Der SP wird rückwärts gezählt.
> Entsprechend verringert sich die Adresse am SP:
>
> Mach doch nen Test.
> Nim statt call   (4 Byte Befehl)
> rcall (2 Byte)
> und guck mal.

Was hat der Unterschied zwischen call und rcall mit dem Stack bzw. 
dem Stackpointer zu tun? Es werden immer zwei Bytes abgelegt.

von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Bewertung
-2 lesenswert
nicht lesenswert
> Arm, wenn man [blah]

Ich meinte erstens eine Stunde für das komplette Problem und nicht nur 
eine einzelne Zeile. Zweitens bin ich ziemlich gut in Assembler, könnte 
das vermutlich ohne Simulator - ist nur etwas Schreibarbeit damit man 
keine Fehler macht.

Aber natürlich wolltest Du das nicht verstehen... verständlich!

von Jens M. (schuchkleisser)


Bewertung
0 lesenswert
nicht lesenswert
Ben B. schrieb:
> Aber natürlich wolltest Du das nicht verstehen... verständlich!

Ich muss das nicht versuchen, ich hab es verstanden, und das hat nicht 
mal lange gedauert.
Die eine Zeile und die Frage dazu braucht nur ein wenig Nachdenken, und 
die Lösung ist klar.
Wobei es kein Rätsel ist, nur ein Verständnisproblem.
Die frage ist allerdings zu allgemein gestellt, Hausaufgaben soll man 
hier ja nicht beantworten.

"Warum zählt der Stack rückwärts?" wäre z.B. eine Frage gewesen, die man 
hätte beantworten können, da wäre dann etwas Initiative sichtbar 
gewesen.

Aber natürlich wolltest Du das nicht verstehen... verständlich!

von Thomas Z. (usbman)


Bewertung
-1 lesenswert
nicht lesenswert
Jens M. schrieb:
> Warum zählt der Stack rückwärts?" wäre z.B. eine Frage gewesen, die man
> hätte beantworten können, da wäre dann etwas Initiative sichtbar
> gewesen.

Naja das ist nicht in Stein gemeißelt. Auch wenn bei den meisten 
Architekturen der Stack rückwärts wächst. Das kann auch anders sein.

von Jens M. (schuchkleisser)


Bewertung
-1 lesenswert
nicht lesenswert
Thomas Z. schrieb:
> Naja das ist nicht in Stein gemeißelt. Auch wenn bei den meisten
> Architekturen der Stack rückwärts wächst. Das kann auch anders sein.

Tjoa, bei der Arch oben in der Aufgabe isser "Standard".

von Hammer V. (mad33)


Bewertung
0 lesenswert
nicht lesenswert
Es ist ja keine Hausaufgabe, da ich ja die Lösung mit gepostet hab :)

Nach call func steht 0x0ffe ?
Woher kommen die darauf?
Und wie kommen die auf SPEICHERADRESSE geändert drauf ?

Speicherinhalt nach dem Befehl?

Eine Erklärung wäre schön

von S. Landolt (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Steht doch alles im von mir gezeigten Auszug des 'AVR® Instruction Set 
Manual'

> Nach call func steht 0x0ffe ?
'SP ← SP-2, (2 bytes, 16 bits)' - SP stand zu Beginn auf 0x1000.

> Und wie kommen die auf SPEICHERADRESSE geändert drauf ?
'STACK ← PC+2'

> Speicherinhalt nach dem Befehl?
Auf dem Stack wird die Adresse für den Rücksprung abgelegt, d.h. die 
Adresse des auf den call folgenden Befehls.

von Hammer V. (mad33)


Bewertung
0 lesenswert
nicht lesenswert
Vielleicht bin ich dumm.
Aber ich verstehe immer noch nicht ?
0x1000- 2 = 0x00fe ?

Das 0x0fff,0x1c,0x00 ?
Wie rechnen die das aus ?
ich kapiere es sorry nicht

von Karl B. (gustav)


Bewertung
0 lesenswert
nicht lesenswert

von Stefan ⛄ F. (stefanus)


Bewertung
0 lesenswert
nicht lesenswert
Hammer V. schrieb:
> 0x1000- 2 = 0x00fe ?

Nein

0x1000 - 2 = 0x0ffe

Oder

0x0100 - 2 = 0x00fe

Das ist ganz banale Mathematik im Hexadezimalsystem.

Wenn man hoch zählt, kommt nach 00fe die Zahl 00ff und dann 0100. Und 
nach 0ffe kommt 0fff und dann 1000.

von Hammer V. (mad33)


Bewertung
0 lesenswert
nicht lesenswert
Ah jetzt verstehe ich es .
Und bei Speicheradresse geändert ?
Da zählen die nur 1 runter ?

0x1000- 1 = 0x0fff ?

Aber wie die auf das kommen ?0x1c
0x00

Verstehe ich immer noch nicht :)

von Stefan ⛄ F. (stefanus)


Bewertung
0 lesenswert
nicht lesenswert
Vielleicht führst du das Programm mal step-by-step im Simulator aus. 
Dabei liest du im "Instruction Set Manual" für jeden einzelnen Befehl 
die Beschreibung und guckst dir im Simulator die Bestätigung dessen an.

von Hammer V. (mad33)


Bewertung
0 lesenswert
nicht lesenswert
Schreibe mal bald klausur und muss das verstehen
Mir fällt das thema sehr schwer

von Karl B. (gustav)


Bewertung
0 lesenswert
nicht lesenswert
Hammer V. schrieb:
> Aber wie die auf das kommen ?0x1c
> 0x00

Hi,
das ist das (der Wert, das Argument), was in der Speicherzelle steht.
Das Ergebnis der Rechenoperationen vorher.
Nicht die Adresse selbst.

ciao
gustav

von S. Landolt (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Der PC (program-counter) steht auf Adresse 0x001a des Programmspeichers 
(flash, hier wird in Worten, also Doppel-Bytes, gezählt). Dort steht der 
Befehl call, ein 2-Wort-Befehl.
  Der SP (stack-pointer) steht auf Adresse 0x1000 des Arbeitsspeichers 
(RAM bzw. SRAM, hier wird in Bytes gezählt).
  call schiebt seine Folgeadresse, 0x001c, auf den Stack. Diese 
Adresse ist ein Wort, also zwei Bytes, folglich steht anschließend im 
RAM auf Adresse 0x1000 das Low-Byte 0c und auf Adresse 0x0fff das 
High-Byte 00 der Folgeadresse. Der stack-pointer wurde dabei um 2 
heruntergezählt.
  Anschließend springt der PC zu der im call angegebenen Adresse 
0x001e == func.

von S. Landolt (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Korrigiere
> das Low-Byte 0c

zu: das Low-Byte 1c

sorry.

von S. Landolt (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Um es nochmals, deutlicher, zu erklären:
Der Program-counter PC zählt (schaltet) im Programmspeicher in 
Wort-Schritten aufwärts (außer bei Sprüngen).
Der Stack-pointer SP zählt (schaltet) im Arbeitsspeicher in 
Byte-Schritten abwärts.

von S. Landolt (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Und wenn ich noch, angesichts des sehr schleppenden Verlaufs hier, einen 
Rat aus meinem Bliss anfügen darf:
'The amount of time spent on a project is not what counts: it's the 
amount of uninterrupted time. Few problems can resist an all-out 
attack; few can be solved piecemeal.'

von Hammer V. (mad33)


Bewertung
0 lesenswert
nicht lesenswert
Ich hatte mir das jetzt so erklärt
0x01a wird 2 mal hochgezählt also 0x01c

Aber wie kommen die dann auf das 0x00 ?
Das ist mir immer noch nicht klar
Sorry
Aber es hilft ja nicht wenn ich sage, dass ich es verstehe :)

Aber danke schon mal für eure Geduld

von S. Landolt (Gast)


Bewertung
0 lesenswert
nicht lesenswert
> Aber wie kommen die dann auf das 0x00 ?
Wie bereits geschrieben, das ist das High-Byte der Adresse.
Eine Programmadresse besteht aus 1 Wort, das sind zwei Bytes. Der 
Arbeitsspeicher, der u.a. ja auch als Stack dient, ist in Bytes 
gegliedert, folglich muss eine Programmadresse, wenn sie im 
Arbeitsspeicher abgelegt werden soll, in die einzelnen Bytes, high und 
low, aufgespalten werden.

von Hammer V. (mad33)


Bewertung
0 lesenswert
nicht lesenswert
Kann man sagen das das 0x00 der Startpunkt des Programmes ist also 0x00?

von S. Landolt (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Jein. Offenbar hat die verkürzte Schreibweise der Adressen zu Beginn zu 
Irritationen geführt (mea culpa, u.a.).

Ein Adresse hat (hier) immer 2 Bytes, dargestellt in 4 nibbles : 
0x1234. Ein Programm beginnt nach einem Reset (normalerweise) bei 0, 
also 0x0000. Der hier diskutierte Programmausschnitt beginnt bei 0x001a. 
Warum das in der einen Tabelle als "00001a" geschrieben wird, sei mal 
dahingestellt, führende Nullen stören ja nicht weiter.

von S. Landolt (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Falls Grundlagen fehlen: ein Byte hat 256 verschiedene Zustände; wie 
schreibt man das am besten - man benutzt Hexadezimal-Ziffern, 0..9,a..f, 
das sind 16 Zustände. 16^2 ergibt 256, also wird ein Byte mit zwei 
Hexziffern geschrieben, bzw. eine Adresse, bestehend aus zwei Bytes, mit 
vier Hexziffern.
Anders gesagt: ein halbes Byte, ein nibble, wird mit einer Hexziffer 
notiert.
Das Halbwort und das Doppelwort
  trieben Sport.
Als Partner wählten sie sich Liste
und byte auf langer Speicherpiste.

Gemischtes Doppel hält sie fit;
  Ball ist's bit.
KLEN (in memoriam)

von rbx (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Eine schöne Übung:

Statt für dies und das von 1 bis x oder von 0 bis x zu zählen, einfach 
mal mit Hex-Zahlen von 100 bis x rückwärts zählen.

100
FF
FE
FD
FC
..usw.

Z.B. könnte man eine zeitlang Benzinpreise verfolgen, die Preise nach 
Hex übersetzen und Preissteigerungen oder Preissenkungen mit Hexzahlen 
anzeigen.

von Hammer V. (mad33)


Bewertung
0 lesenswert
nicht lesenswert
Danke für die Erklärungen

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.