Äh, das SUB ist hier keine Anweisung sondern eine Sprungmarke. Der Opcode 81 steht für RTS.Welche Zahl wird für den Accumulator gebraucht?
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
Die Lösung laut Unterlagen wäre 07. Ich bin ein wenig verwirrt.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
Ah das erklärt einiges, aber der SUB gibt ja nichts zurück....Äh, das SUB ist hier keine Anweisung sondern eine Sprungmarke. Der Opcode 81 steht für RTS.
ja 07Also speichere ich im Stack die Werte ab, welche aufsteigend abgefragt werden. Am Ende habe ich somit 07..richtig soweit?
Das Unterprogramm muss ja nichts zurückgeben.Ah das erklärt einiges, aber der SUB gibt ja nichts zurück....
?!?Also speichere ich im Stack die Werte ab, welche aufsteigend abgefragt werden. Am Ende habe ich somit 07..richtig soweit?
Also CD (1) 01 (2) 00 (3)?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.
Was willst Du mir damit sagen?Also CD (1) 01 (2) 00 (3)?
Soweit ich verstehe, ist das ein 3 Wort Befehl, d. h. der Zähler PC wird um 3 erhöht....also0101 + 3 = 0104Was willst Du mir damit sagen?
Ja aber die Frage war was nach den zweiten JSR nach dem Rücksprung an adresse 00FF steht. Und das wurde auch schon gesagt.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.Soweit ich verstehe, ist das ein 3 Wort Befehl, d. h. der Zähler PC wird um 3 erhöht....also0101 + 3 = 0104