Bisher war bekannt, daß Register mit Werten versehen werden können, daß man die auch von da ins RAM speichern kann und die Werte im Register ändern kann.
(In Beispielen gezeigt haben wir bisher nur das Laden ( in den Akku ) und das Hochzählen von zwei Registern (XR,YR). Außerdem haben wir - ohne ein Register zu benutzen - eine Adresse direkt im Speicher hochgezählt.)
Beim Zugriff aufs RAM taucht das Problem auf, daß man wissen muß, worauf man gerade zugreifen will. Um das zu ermöglichen hat, zumindest bei den "normalen" "kleinen" Homecomputern, um die es hier vornehmlich geht, jede Speicherstelle im RAM einen eigenen Nummerncode. Das RAM wird dazu i.P. einfach bei Null beginnend durchnummeriert. Fortlaufend.
Diese "Hausnummern" der Speicherstellen sind ihre jeweilige ADRESSE
So eine Adresse ist in dem einfachen Fall der Homecomputer der 8 Bit Zeit i.a. einfach eine einzige Zahl.
Und natürlich ist das wieder eine hexadezimale Zahl. Zumindest im Assembler, meistens.
Man kann die aber natürlich in eine dezimale Zahl umrechnen.
So ist z.B. die schon oft benutzte Adresse $5000 das Gleiche wie die dezimale Zahl 20480. Es handelt sich um den identischen Wert nur in einem anderen Zahlensystem.
Um eine solche Adresse anzusprechen, kann man jeden Befehl benutzen, der Adressierung erlaubt.
Einer der häufigsten benutzten ist dabei einer der Art
LADE_den_Wert : der_in_Adresse_NR_x_steht : in_das_Register_mit_Bezeichnung_soundso
entsprechend gibt es dann auch das Gegenteil, nämlich
SPEICHERE_den_Wert : aus_dem_Register_mit_Bezeichnung_soundso : in_die_Speicherstelle_mit_der_Adresse_NR_x
Wenn es sich dabei um die gleiche Adresse handelt, benutzt man in beiden Fällen auch die gleiche Zahl dafür (z.B. $5000).
Möchte man seine Zahl aber in die nachfolgende Adresse speichern, würde man ADRESSE+1 benutzen (z.B. $5001).
Wie groß die größte Adresse sein kann, hängt einfach vom Rechner ab.
Wichtig ist dabei, daß die Adresse und ihr möglicher größter Wert völlig unabhängig davon ist, wie groß die Zahl sein darf, die man in dieser Adresse speichern darf.
Es macht also einen Unterschied, ob man von der Adresse ODER vom Inhalt der Adresse spricht !
Bei den 8Bit Rechnern, ist das noch gut unterscheidbar, weil da i.a. der Wert, der unter einer Adresse gespeichert werden kann, ein 8 Bit Wert sein kann. Der Inhalt einer bestimmten Adresse kann also - genau wie ein 8 Bit Register - nur Zahlen von 0 bis 255 enthalten.
Dagegen ist der Adresswert selber oft deutlich größer. So ein Adressbereich hat ja oft 16 Kilobyte, oder 64 Kilobyte abzudecken. Und schon so ein Uralt-Teil wie ein ZX81 mit großzügigen 1 Kilobyte RAM kann schon nicht alle Adressen mit 256 Zahlen durchnummerieren - 1 KB sind ja bereits 1024 Adressen !
Um dem Befehl eine Adresse mitzugeben, gibt es dann zusätzlich noch unterschiedliche Varianten. Oft ist es sogar so, daß man einen Befehl im Assembler mit verschiedenen Arten der Adressübermittlung benutzen kann. Der Befehl liest sich dann fast gleich, oder ähnlich, es passiert aber möglicherweise etwas leicht anderes.
(auf Ebene der Maschinencodes handelt es sich dabei dann auch tatsächlich um unterschiedliche Befehle, die man aber im Assembler wie einen wahrnimmt; vielleicht kann man sagen, daß sie unter Assembler ein Befehlsfamilie bilden)
Typ A - die einfache Adressierung (oder: direkte Adressierung)
die ist "einfach", weil man dem Befehl die komplette Adresse mitgibt. Es steht also im Befehl exakt die gewünschte Adresse drin.
Man schreibt also: Befehl $Adresse
Typ B - die Zeropage Adressierung
das ist möglicherweise ein besonderes Feature der 6502 CPU, prinzipiell gibt es aber eine Zeropage auch auf anderen Rechnern.
Gemeint ist mit "Zeropage" die allererste Abteilung der Hausnummern, d.h. der Adressen. So eine Adresse wäre z.B. die $0042, oder die $0023, die $0074, die $00EA, die $0011, die $00C0 oder, die letzte Adresse auf der Zeropage, die $00FF.
Wenn man die Zahlen ansieht, haben die alle was gemeinsam !
Die ersten beiden "Ziffern" sind immer "00".
Es sind daher Adressen, die man auch einfach exakt wiederfindet, wenn man nur die beiden letzten "Ziffern" kennt - also die $42, $23, $74, $EA usf.
Und genau das macht die CPU bei der Zeropage Adressierung auch - sie benutzt nur die hintere Hälfte der "echten" Adresse, um dort was hineinschreiben zu können oder daraus zu lesen.
Es ist damit jetzt auch schon klar, wieviel Adressen die Zeropage hat. Denn: $FF war so ein Merkwert, den man einfach weiß !
Er war genau 255 (wenn man bei 0 beginnt zu zählen). Es gibt also die Adressen 0 bis 255 in der Zeropage, was 256 Adressen insgesamt sind.
Auch hier schreibt man einfach: Befehl $Adresse , ABER die Adresse wird nur mit der abgekürzten Form angegeben, als z.B. nicht $0023, sondern $23
Vorteil : Es ist kürzer. Und es ist schneller, bei der Ausführung.
Nachteil: Viele dieser Adressen sind schon belegt und nicht frei nutzbar (, aber einige sind schon noch da).
Typ C - indexierte Adressierung
Das klingt schon kompliziert.
Ist es aber eigentlich nicht.
Es bedeutet einfach, daß man eine Adresse, wie bei der normalen, einfachen Adressierung angibt. Zusätzlich gibt man aber noch einen zweiten Wert mit. Bevor die CPU irgendwas macht, berechnet sie aus beiden eine Summe, also
Adresse + Indexwert
und diese Summe ist dann die Stelle im RAM, wo gesucht wird, es ist also
Adresse = angegebene Adresse + angegebener Indexwert
Geschrieben wird sowas oft in der Art:
Befehl $Adresse , Indexwert
Das ist ein mächtiges Tool !
Es gibt noch viele weitere Adressierungsarten, aber die kommen mal extra.