Beiträge von markusk2020 im Thema „Parameterübergabe über die Zeropage“

    Hätte hier abschließend noch ein kleines Rechenbeispiel und bin mir nicht sicher ob ich das richtig verstanden habe.

    Es geht um die genauen Abläufe wenn ein JSR ausgeführt wird. Das Programm ist sinnbefreit, es geht rein um den Ablauf beim Aufruf des Unterprogramms und dann den Rücksprung zum Aufrufer mit RTS.

    1500 A2 00 LDX Bitte melde dich an, um diesen Link zu sehen.

    1502 A9 01 LDA Bitte melde dich an, um diesen Link zu sehen.

    1504 20 00 30 JSR $3000

    1507 RTS

    Die Rücksprungadresse ist ja eigentlich $1507.

    Laut der Beschreibung auf der Seite Bitte melde dich an, um diesen Link zu sehen. wird die Adresse des JSR-Opcodes $1504 +2 auf den Stack gelegt, also die um 1 verminderte Rücksprungadresse $1507-1 = $1506, und zwar zuerst das Hi-Byte $15 und dann das Lo-Byte $06.

    Hier das Unterprogramm:

    3000 INX

    3001 INX

    3002 INX

    3003 INX

    3004 RTS

    Der Befehl RTS holt sich die Adresse dann wieder vom Stack, addiert 1 drauf und trägt $1507 im Program Counter ein wodurch es beim RTS an der Adresse $1507 weitergeht mit der Programmausführung.

    Hab ich das richtig verstanden?

    Die Klassiker sind die Adressen 2, 251, 252, 253 und 254. Stack ist wirklich unpraktisch, weil man auf den nicht wirklich geschickt beliebig zugreifen kann (und wenn man die Parameter runter-popped, muss man sie ja meist auch wieder irgendwo zwischenspeichern).

    Stimmt, die Abwicklung über den Stack ist wirklich recht umständlich, hab gestern mal versucht drei Parameter über den Stack an ein Unterprogramm zu übergeben, da kommt recht schnell einiges an Code zusammen und der Zugriff ist dann auch nicht so einfach wie am PC, dort friert man ja üblicherweise den Inhalt des SP-Registers im BP-Register ein und greift dann einfach per Index auf die Parameter zu, z.B. mit mov ax, [bp+4]

    Erschwerend kommt noch hinzu dass man ja nur den Inhalt des Akkumulators und des Statusregisters direkt per Maschinenbefehl auf den Stack bringen bzw. von dort wieder holen kann. Da ist der Weg über die Zeropage oder irgendeine eigene Struktur sicher einfacher.

    Stimmt, die Abwicklung über den Stack ist wirklich recht umständlich, hab gestern mal versucht drei Parameter über den Stack an ein Unterprogramm zu übergeben, da kommt recht schnell einiges an Code zusammen und der Zugriff ist dann auch nicht so einfach wie am PC, dort friert man ja üblicherweise den Inhalt des SP-Registers im BP-Register ein und greift dann einfach per Index auf die Parameter zu, z.B. mit mov ax, [bp+4]

    Erschwerend kommt noch hinzu dass man ja nur den Inhalt des Akkumulators und des Statusregisters direkt per Maschinenbefehl auf den Stack bringen bzw. von dort wieder holen kann. Da ist der Weg über die Zeropage oder irgendeine eigene Struktur sicher einfacher.

    Hallo!

    Ich hab hier in einem älteren Thread gelesen dass zur Parameterübergabe an Unterprogramme auch oft (vor allem bei mehreren Parametern) Stellen in der Zeropage genutzt werden wenn man mit den Registern nicht mehr auskommt.

    Für mich als Assembler-Anfänger stellt sich hier jedoch die Frage: Welche Adressen kann ich hier gefahrlos für diesen Zweck nutzen?

    Die Zeropage enthält ja ziemlich viele wichtige und essentielle Informationen und selbst wenn ich Zeropage-Adressen verwende die auf meinem System nicht genutzt werden heißt das ja nicht dass das auf anderen Systemen auch der Fall ist.

    Dann würde mein Programm auf anderen Systemen ja eventuell nicht einwandfrei laufen.

    Ich muss da aktuell ziemlich umdenken da ich von der Assembler-Programmierung am PC komme und von dort natürlich die Parameterübergabe über den Stack gewohnt bin.

    Doch gerade diese Methode wurde in dem oben genannten Thread nicht als die optimale Methode in Bezug auf 6502 Assembler dargestellt und dass sie eher nur für Spezialfälle (Rekursion, Reentranz) verwendet wird.

    Und ich kann das auch nachvollziehen weil man verhältnismäßig viel Code für das Parameterhandling schreiben muss.

    lg, Markus