Assembler Aufgabe Erklärung

Beitrag #6350179 wurde von einem Moderator gelöscht.
#6350343
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
#6350373
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
Gast #6350446
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.
#6350457
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.
Gast #6350495
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.
(Firma: Funkenflug Industries) #6350506
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!
#6350577
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!
Gast #6356894
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.
Gast #6357064
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.
Gast #6357089
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.
Gast #6357160
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.
Gast #6357177
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.'
Gast #6357185
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.
Gast #6357196
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.
Gast #6357208
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)
Gast #6357212
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren