Diskussion:Stapel

Aus C64-Wiki
Zur Navigation springenZur Suche springen

Methodik der Messung[Quelltext bearbeiten]

Ergebnis[Quelltext bearbeiten]

Verbrauch am Stack:

Konstruktion Stackverbrauch
Bytes
Aufrufe Anmerkung
GOSUB 7 23
FN 16 10 + USR(0) (11 ohne USR())
FOR-NEXT: 18 9 + USR(0) (10 ohne USR())
Ausdrucksrekursion 12 - nur in Kombination mit Klammerung
Klammerung "()" 5 35
Verschachtelung: Ausdrucksrekursion+Klammerung 17 10


Programme[Quelltext bearbeiten]

Quellcode für Hilfsmaschinenprogramme[Quelltext bearbeiten]

Stapelzeigerermittlung mittels USR():

TSX
TXA
TAY
JMP $B3A2  ; Y-> FAC

Verwendung:

PRINT USR(8)
 241

Stapelzeigerermittlung mittels SYS:

TSX
RTS

Verwendung:

SYS828:PRINTPEEK(781)
 246

BASIC-Programm[Quelltext bearbeiten]

1 x=(((((((((((((((((((((((((((((((((((.)))))))))))))))))))))))))))))))))))
5 poke828,186:poke829,138:poke830,168
6 poke831, 76:poke832,162:poke833,179
7 poke785, 60:poke786,3
8 poke834,186:poke835,96
10 deffna(x)=fnb(x)+1
11 deffnb(x)=fnc(x)+1
12 deffnc(x)=fnd(x)+1
13 deffnd(x)=fne(x)+1
14 deffne(x)=fnf(x)+1
15 deffnf(x)=fng(x)+1
16 deffng(x)=fnh(x)+1
17 deffnh(x)=fni(x)+1
18 deffni(x)=fnj(x)+1
19 deffnj(x)=fnz(x)+1
20 deffnk(x)=fnz(x)+1
30 deffnz(x)=           1
31 rem deffnz(x)=usr(8)*100+1
100 print fna(0)
199 end
200 x=x+1:printusr(8);:gosub200
299 end
300 fori=1to10:printusr(8)
301 forj=1to10:printusr(8)
302 fork=1to10:printusr(8)
303 forl=1to10:printusr(8)
304 form=1to10:printusr(8)
305 forn=1to10:printusr(8)
306 foro=1to10:printusr(8)
307 forp=1to10:printusr(8)
308 forq=1to10:printusr(8)
309 forr=1to10
310 remfors=1to10:sys834
399 end
400 printusr(8)+usr(8)*1000
499 end
500 print 1+(2+(3+(4+(5+(6+(7+(8+(9+(10+(11+12))))))))))

Auswertung[Quelltext bearbeiten]

Arithmetische Ausdrücke[Quelltext bearbeiten]

run400
229241

Eine Ebene braucht:

print241-229
 12

Verbrauch einer Klammer:

print usr(8)+10000*(user(8))
2120241
print usr(8)+10000*user(8)
2170241

-> eine Klammer brauch 5 Bytes

Anzahl der Klammerverschachtelungen mittels Zeile 1:

  • -> 36 -> out of memory
  • -> 35 -> ok (5*35 = 175)

Ausdrucksrekursionen[Quelltext bearbeiten]

11 Ebenen

500 print 1+(2+(3+(4+(5+(6+(7+(8+(9+(10+(11+12))))))))))
run500
?out of memory in 500

Platzverbrauch am Stapel: 11*12 + 10*5 -> 182

500 print 1+(2+(3+(4+(5+(6+(7+(8+(9+(10+(11))))))))))
run500

ok
Platzverbrauch am Stapel: 10*12 + 10*5 -> 170

500 print 1+(2+(3+(4+(5+(6+(7+(8+(9+(10+(((11))))))))))))
?out of memory in 500

Platzverbrauch am Stapel: 10*12 + 12*5 -> 180

500 print 1+(2+(3+(4+(5+(6+(7+(8+(9+(10+((11)))))))))))

ok
Platzverbrauch am Stapel: 11*5+10*12 -> 175

FN[Quelltext bearbeiten]

run
81

ein Aufruf weniger:

97

GOSUB[Quelltext bearbeiten]

run200
241 ... 80
?out of memory error in 200

FOR-NEXT[Quelltext bearbeiten]

run300
241 for
223
205
...
79


Bilder[Quelltext bearbeiten]

Wohin sind den die tollen Erklärbilder hin verschwunden?--Jodigi 22:14, 8. Okt. 2009 (CEST)

Hier:

Bild:Ass_befehl_48.gif

Bild:Ass_befehl_68.gif

Ich vermute mal, daß passt besser zu den Befehlen PHA/PLA als in eine allgemeine Beschreibung des Prozessorstapels. Moiree 22:32, 8. Okt. 2009 (CEST)

(Ich habe mir mal erlaubt, die Bildreferenzen von Moiree nur als Links zu machen) Genau. Erklärt wurden da die Befehle PHA/PLA (die Bilder werden auch auf den Seiten der Befehle benutzt), nicht der Stapel an sich, und das nahm übermäßig Platz weg. Wenn ich schon beim Meckern bin ;-), die Bilder könnte man auch noch etwas überarbeiten, z.B. fehlt eine klare Schrittabfolge (was passiert zuerst, was dann, was als letztes); es ist nicht klar, was auf dem Stack eigentlich ist (z.B. Bild:Ass_befehl_68.gif: Der Wert $100 liegt auf dem Stack? Beim Akku wird jedenfalls diese "Bildsprache" benutzt ("nn" ist zweifellos der Inhalt des Akkus). Wieso ist die (Adresse) $100 oben und nicht wie sonst in Speicherbelegungsplänen unten? Liegt der Inhalt der Stackpointer auf dem Stack? Aber zugegebenermaßen bin ich auch zu faul, das zu korrigieren ;-). -- 1570 00:34, 9. Okt. 2009 (CEST)
Tut mir leid, aber ich muss schon wieder meckern: "Der Stapelzeiger (Adresse innerhalb der $0100 Page) verweist auf die nächste freie Stapelspeicherstelle. Der Stapel wird von oben nach unten gefüllt, d.h. das erste auf den Stapel gelegte Byte wandert nach $01FF und der Stapelzeiger enthält dann $FE." - Formulierung schwammig (der Stapelzeiger *ist* keine Adresse innerhalb der $0100 Page, sondern *zeigt* auf eine Speicherstelle innerhalb der Stack Page), Fakten unklar (woher kommt das $FE?). Klar, man könnte alles um den Stack hier erklären, aber dafür sind eigentlich die Links da. So ist das eher halbfertig und verwirrend...? Üblicherweise nimmt man übrigens $xx(yy) für eine Adresse und #$xx für einen Wert, aber das ist auch schon wieder eine Sache, die im ganzen Wiki etwas schiefhängt... so viel zu tun... ;-) -- 1570 17:02, 9. Okt. 2009 (CEST)