- Adressierungsarten
- Registeradressierung
- Einstufige Speicheradressierung
- IMM (immediate): Unmittelbare Adressierung
- ABS: Absolute (direkte) Adressierung
- Seitenadressierung
- Registerindirekte Adressierung
- Indizierte Adressierung
- Speicherrelative Adressierung oder ABS,X oder Z-I,X indizierte Adressierung (65XX)
- Registerrelative Adressierung
- Registerrelative Adressierung mit Index
- REL: Programmzählerrelative Adressierung
- Zweistufige Speicheradressierung
Adressierungsarten
| Adressierungsart | 65XX | Beispiel | Hinweis |
|---|---|---|---|
| Registeradressierung | |||
| Impliziert | IMP | LSRA | |
| ACC | ROL A | ||
| Flag | IMP | CLI | |
| Explizit | - | DEC R0 | |
| Einstufige Speicheradressierung | |||
| Unmittelbar | IMM | LDA #$85 | # steht für unmittelbarer Wert. |
| Absolut (direkt) | ABS | JMP $1044 | |
| Zero-Page | Z-P | INC $7F | |
| Seiten-Register | - | LD R0,<$7F | höherwertiges Byte kommt aus DP-Register. |
| Registerindirekt | - | LD R1,(A0) | |
| Speicherrelativ | ABS,X | ST R1,$A704(R0) | |
| ABS,X | LDA $1567,Y | ||
| Z-I,X | DEC $44,X | ||
| Registerrelativ | DEC $A7(B0)(I0) | ||
| Programmzählerrelativ | REL | LBRA $7FFF | |
| Zweistufige Speicheradressierung | |||
| Indirekt absolute | - | LDA ($A347) | |
| IND | JMP ($0402) | Bei 65XX Indirekt nur bei JMP erlaubt. | |
| Nachindiziert indirekt | (IND),Y | LDA ($52),Y | |
| Indirekt registerindirekt | - | LD R0,((R1)) | |
| Indirekt indiziert | - | INC ($10(B0)(I2)) | |
| IND,X | LDA ($50,X) | ||
| Indiziert indirekt | - | INC $A7($10(B0))(I2) | *Kopfschmerzen* :) |
| Indirekt programmzählerrelativ | . | JMP ($A7(PC)) |
Registeradressierung
IMP (implied): Implizite Adressierung
Verschiebe den Inhalt des Akkumulators A um eine Bitposition nach rechts. Die effektive Adresse ist im OpCode enthalten (LSR_A_):
LSRA
Spezialform der impliziten Adressierung ist die Flag-Adressierung, z.B. das Setzen des Interrupts- oder das Löschen des Carry-Flags:
SEI CLC
Weitere Spezialform z.B. des 65XX: ACC (Accumulator), z.B. das Linksrotieren des Akkumulators:
ROL A
Explizite Registeradressierung
Dekrementiere den Inhalt des Registers R0. Die effektive Adresse steht im REG-Feld des OpCodes:
DEC R0
Einstufige Speicheradressierung
IMM (immediate): Unmittelbare Adressierung
Dezimalwert 85 in Akkumulator laden:
LDA #85
ABS: Absolute (direkte) Adressierung
Programmsprung an Adresse 0x1044
JMP $1044
Seitenadressierung
Z-P: Zero-page-Adressierung
Erhöhe den Inhalt der Speicherzelle $007F um 1:
INC $7F # $7F --> $007F
Seiten-Register-Adressierung
Bei der Seiten-Register-Adressierung wird mit DP-Register (direct page register) die höherwertigen Bytes der Adresse bestimmt.
Lade das Register R0 mit dem Inhalt des Speicherwortes $A57F (im DP-Register steht $A5):
LD R0,$7F
Setzt man das DP-Register auf $00, erhält man die Zero-page-Adressierung, siehe vorherige Überschrift.
Registerindirekte Adressierung
Lade das Register R1 mit dem Inhalt des durch das Adressregister A0 adressierten Speicherwortes:
LD R1,(A0)
Indizierte Adressierung
Speicherrelative Adressierung oder ABS,X oder Z-I,X indizierte Adressierung (65XX)
Speichere den Inhalt von Register R1 in das Speicherwort, dessen Adresse sich durch Addition des Inhalts von R0 zur Basis $A704 ergibt:
ST R1,$A704(R0)
Beispiel 65XX: Speichere den Inhalt in Akkumulator ab, dessen Adresse sich aus der Addition der Adresse $1567 und dem Inhalt des Y-Indexregister ergibt:
LDA $1567,Y
Spezialfall beim 65xx. Dekrementiere das Speicherwort, dessen Zero-Page-Adresse sich durch Addition des X-Indexregister und $44 ergibt.
DEC $44,X
Registerrelative Adressierung
Lösche das Speicherwort, dessen Adresse sich durch die Addition des hexadezimalen Offsets $A7 zum Inhalt des Basisregister B0 ergibt:
CLR $A7(B0)
Registerrelative Adressierung mit Index
Dekrementiere das Speicherwort, dessen Adresse sich durch die Addition der Inhalte der Register I0 und B0 mit dem Offset $A7 ergibt:
DEC $A7(B0)(I0)
REL: Programmzählerrelative Adressierung
Verzweige "unbedingt" zu der Speicherzelle, deren Adressdistanz zum aktuellen Programmzähler 32767 (=$7FFF) ist:
LBRA $7FFF
Zweistufige Speicheradressierung
IND: Indirekte absolute Adressierung
Lade den Akkumulator A mit dem Inhalt des Speicherwortes, dessen Adresse im Speicherwort $A347 steht:
LDA ($A347)
Beispiel 65XX: Programmsprung an die Adresse, die in Adresse $0402 abgelegt ist:
JMP ($0402)
(IND),Y: Nachindizierte indirekte Adressierung
Speichere den Inhalt des Speicherworts im Akkumulator ab, dessen Adresse sich durch die Addition von $50 und der Adresse, die im Y-Indexregister abgelegt ist, ergibt.
LDA ($52),Y
Indirekte registerindirekte Adressierung
Lade den Inhalt des durch R1 adressierten Speicherwortes in den Adresspuffer und bringe danach den Inhalt des durch den Adreßpuffer angesprochenen Speicherwortes in das Register R0
LD R0,((R1))
Indirekte indizierte Adressierung oder (IND,X): Vorindizierte indirekte Adressierung
Es wird zunächst eine Adresse durch die Addition einer Adresse mit einem Index (1), einem Offset mit einem Basisregister (2) oder einem Offset, einer Basisadresse und einem Index (siehe auch oben: Indizierte Adressierung) eine Zwischenadresse gebildet. Diese Zwischenadresse enthält dann die effektive Adresse.
INC ($A711(I2)) # 1: speicherrelativ INC ($10(B0)) # 2: speicherrelativ INC ($10(B0)(I2)) # 3: speicherrelativ mit Index
Beim 65XX kommt ein ähnliche Adressierung zum Einsatz, die jedoch mit Zero-Page Adressen arbeitet. Beispiel:
Speichere den Inhalt des Speicherworts im Akkumulator ab, dessen Adresse in der Adresse abgelegt ist, die sich durch Addition von $50 und des Wertes im X-Indexegister ergibt.
LDA ($50,X)
Indizierte indirekte Adressierung
Siehe vorherige Adressierung, jedoch kommt hier zu erst die indirekte Adressierung zum Einsatz und dann die Indizierung.
Extrembeispiel: Zunächst wird der Offset $10 mit dem Inhalt des Basisregisters B0 addiert: $I0(B0). Diese Summe ergibt die Adresse, in der die Basisadresse des Operanden abgelegt ist: ($I0(B0)). Die effektive Adresse des Operanden erhalten wir schließlich durch Addition des Inhaltes des Indexregisters I2 sowie des Offsets $A7 zu dieser Basisadresse: $A7($I0(B0))(I2). Nun kann der eigentliche Befehl, die Erhöhung des Speicherworts an dieser effektiven Adresse erfolgen.
INC $A7($10(B0))(I2)
Indirekte programmzählerrelative Adressierung
Addiere zum Inhalt des Programmzählers den Offset $A7. Entnehme dem durch diese Summe adressierten Speicherwort die Adresse, an der das Programm fortgesetzt werden soll:
JMP ($A7(PC))