M68HC05 Code intepretieren

osion

Bekanntes Mitglied
Hallo

Ich soll ermitteln, welche Zahl am Ende unter der Speicheradresse $00FF gespeichert wird.
Welche Zahl wird für den Accumulator gebraucht?

1647172398857.png

1647172425184.png
 

Jw456

Top Contributor
Bein Rücksprung aus einem Call wird die Adresse vom Stack gepopt. der SP wird neu gesetzt der Speicherinhalt wir normalerweise nicht gelöscht.

es wird 0104 enthalten sein.

Da Motorola doch zuerst das High dann Low Byte im Ram speichert, sollte es $01 sein.
Bei einer X86 CPU wäre es $04
 
Zuletzt bearbeitet:

Jw456

Top Contributor
ich glaube es war so beim 6800 bei einem JSR zuerst wird das HSB Push und dann das LSB

00FC 01
00FD 07
00FE 01
00FF 04
 

osion

Bekanntes Mitglied
Bein Rücksprung aus einem Call wird die Adresse vom Stack gepopt. der SP wird neu gesetzt der Speicherinhalt wir normalerweise nicht gelöscht.

es wird 0104 enthalten sein.

Da Motorola doch zuerst das High dann Low Byte im Ram speichert, sollte es $01 sein.
Bei einer X86 CPU wäre es $04
ich glaube es war so beim 6800 bei einem JSR zuerst wird das HSB Push und dann das LSB

00FC 01
00FD 07
00FE 01
00FF 04
Die Lösung laut Unterlagen wäre 07. Ich bin ein wenig verwirrt.

Ablauf:
1. Setzt den Stapelzeiger an den Anfang des Stapels zurück.
2. Rufe zweimal eine SUB auf
3. Ende des Programms

Also speichere ich im Stack die Werte ab, welche aufsteigend abgefragt werden. Am Ende habe ich somit 07..richtig soweit?

Äh, das SUB ist hier keine Anweisung sondern eine Sprungmarke. Der Opcode 81 steht für RTS.
Ah das erklärt einiges, aber der SUB gibt ja nichts zurück....
 

mihe7

Top Contributor
Ah das erklärt einiges, aber der SUB gibt ja nichts zurück....
Das Unterprogramm muss ja nichts zurückgeben.

Also speichere ich im Stack die Werte ab, welche aufsteigend abgefragt werden. Am Ende habe ich somit 07..richtig soweit?
?!?
Du hast eine JSR-Anweisung, die legt die Rücksprungadresse auf den Stack und führt einen unbedingten Sprung an die angegebene Adresse (SUB) aus.

Die Anweisung an Adresse 0101 ist CD 02 00 (JSR SUB), benötigt also drei Bytes, daher ist die Rücksprungadresse 0101 + 3 = 0104.

Die wird auf den Stack gelegt. Der Stackpointer SP ist zunächst $FF. D. h. an Adresse $FF wird die 04 abgelegt, an Adresse $FE die 01 (falls LSB first), der Stackpointer ist dann $FD.

Anschließend findet der Sprung nach 0200 statt. Dort findet sich ein RTS. RTS holt die Rücksprungadresse vom Stack und führt den unbedingten Sprung dorthin aus. Es wird also die Adresse 0104 vom Stack gelesen, der Stackpointer ist dann wieder $FF, der Sprung nach 0104 wird ausgeführt.

An Adresse 0104 findet sich nun wieder die Anweisung CD 02 00 (JSR SUB), benötigt also drei Bytes, daher ist die Rücksprungadresse 0104 + 3 = 0107.

Die wird auf den Stack gelegt. Der Stackpointer SP ist zunächst $FF. D. h. an Adresse $FF wird die 07 abgelegt, an Adresse $FE die 01 (falls LSB first), der Stackpointer ist dann $FD.

Anschließend findet der Sprung nach 0200 statt. Dort findet sich ein RTS. RTS holt die Rücksprungadresse vom Stack und führt den unbedingten Sprung dorthin aus. Es wird also die Adresse 0107 vom Stack gelesen, der Stackpointer ist dann wieder $FF, der Sprung nach 0107 wird ausgeführt.

An $FF steht nach wie vor die 07.
 

osion

Bekanntes Mitglied
Das Unterprogramm muss ja nichts zurückgeben.


?!?
Du hast eine JSR-Anweisung, die legt die Rücksprungadresse auf den Stack und führt einen unbedingten Sprung an die angegebene Adresse (SUB) aus.

Die Anweisung an Adresse 0101 ist CD 02 00 (JSR SUB), benötigt also drei Bytes, daher ist die Rücksprungadresse 0101 + 3 = 0104.

Die wird auf den Stack gelegt. Der Stackpointer SP ist zunächst $FF. D. h. an Adresse $FF wird die 04 abgelegt, an Adresse $FE die 01 (falls LSB first), der Stackpointer ist dann $FD.

Anschließend findet der Sprung nach 0200 statt. Dort findet sich ein RTS. RTS holt die Rücksprungadresse vom Stack und führt den unbedingten Sprung dorthin aus. Es wird also die Adresse 0104 vom Stack gelesen, der Stackpointer ist dann wieder $FF, der Sprung nach 0104 wird ausgeführt.

An Adresse 0104 findet sich nun wieder die Anweisung CD 02 00 (JSR SUB), benötigt also drei Bytes, daher ist die Rücksprungadresse 0104 + 3 = 0107.

Die wird auf den Stack gelegt. Der Stackpointer SP ist zunächst $FF. D. h. an Adresse $FF wird die 07 abgelegt, an Adresse $FE die 01 (falls LSB first), der Stackpointer ist dann $FD.

Anschließend findet der Sprung nach 0200 statt. Dort findet sich ein RTS. RTS holt die Rücksprungadresse vom Stack und führt den unbedingten Sprung dorthin aus. Es wird also die Adresse 0107 vom Stack gelesen, der Stackpointer ist dann wieder $FF, der Sprung nach 0107 wird ausgeführt.

An $FF steht nach wie vor die 07.
Also CD (1) 01 (2) 00 (3)?
 

Jw456

Top Contributor
JSR ist ein Unterprogramm Aufruf (Call) es wird zu der Adresse gesprungen die im Befehl ist. Dazu wird der PC Programmcounter auf die Adresse gesetzt hier 0x0200.

Für den Rückweg aus denn Unterprogramm wir die Rücksprung Adresse auf den Stack gelegt. Das ist in diesem Fall 0x0107. Wenn in dem Unterprogramm ein RST Befehl erkannt wird, wird die Adresse auf die der SP zeigt gelesen und in den PC geladen.
Somit geht es bei dem nächsten Befehl vom Hauptprogramm weiter.
 

mihe7

Top Contributor
Soweit ich verstehe, ist das ein 3 Wort Befehl, d. h. der Zähler PC wird um 3 erhöht....also0101 + 3 = 0104
Jein. Der Befehl JSR benötigt 1 Byte (OpCode) zzgl. 2 Bytes für die Adresse. Macht insgesamt 3 Bytes. Da es sich um einen Sprung handelt, wird der PC nicht um 3 erhöht sondern eben auf diese Adresse gesetzt. Zuvor wird die Rücksprungadresse noch auf den Stack gelegt.
 

Neue Themen


Oben