Forum: Mikrocontroller und Digitale Elektronik Assembler Aufgabe Erklärung


von Hammer V. (mad33)



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)


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:

Lesenswert?

Das war jetzt einfach.

von Martin V. (oldmax)


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)


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)


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)


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)


Lesenswert?

Quatsch - natürlich 1e, dorthin springt ja der call !

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


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)


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)


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)


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)


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)


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)


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)


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)


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)


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)


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)


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)


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)


Lesenswert?


von Stefan F. (Gast)


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)


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


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)


Lesenswert?

Schreibe mal bald klausur und muss das verstehen
Mir fällt das thema sehr schwer

von Karl B. (gustav)


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)


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)


Lesenswert?

Korrigiere
> das Low-Byte 0c

zu: das Low-Byte 1c

sorry.

von S. Landolt (Gast)


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)


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)


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)


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)


Lesenswert?

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

von S. Landolt (Gast)


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)


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.
1
Das Halbwort und das Doppelwort
2
  trieben Sport.
3
Als Partner wählten sie sich Liste
4
und byte auf langer Speicherpiste.
5
6
Gemischtes Doppel hält sie fit;
7
  Ball ist's bit.
KLEN (in memoriam)

von rbx (Gast)


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)


Lesenswert?

Danke für die Erklärungen

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.