Diskussion:Stapel
Aus C64-Wiki
Zur Navigation springenZur Suche springenMethodik 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:
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)