/media/sda-magnetic/david/Dokumente-15/fernuni-hagen/cs-i-ii/old-cs-2-03/ttl-74xx/avr3.txt


Also, ich habe es jetzt:

ld, ldd, st, stdd

gehen nur zusammen mit den Pointer

X
Y
Z

Und das ist logisch - weil, selbst, auf einem Prozessor, der eigentlich irgendwo ein 8-Bit Prozessor ist, ist die Addressierung mit 8 Bit etwas geringt: 256 - und natürlich, das ist klar, lässt sich der Atmega8 zum Beispiel mit 16 Bit addressierung. Deswegen macht indirekte und indizierte Addressierung mit einem Byte keinen Sinn. Deswegen fasst man zwei Register zusammen:

X-Pointer: r26, r27
Y-Pointer: r28, r29
Z-Pointer: R30, r31

Und ld, ldd, st, std gehen nur in Verbindung mit X, Y, Z-Pointer.

Dabei ist ld load - und st store. Das heißt, load, wir nehmen den Wert aus diesen so addressierten Speicherstellen und store - wir speichern das da.

Jetzt gibt es noch die Möglichkeit: Die direkte Addressierung.

Bisher haben wir indirekt und indiziert.

Ah ja, das ist auch noch wichtig - indizierte Addressierung ldd und std sind indiziert. Und was nicht geht, ist schreiben

FALSCH!!! ldd r0, Y FALSCH!!

Sondern, das muss in jedem Fall heißen

ldd rx, Y+k

Das ist logisch, weil das ist indiziert. Ohne +k ist es nicht indiziert.

Jetzt: Jetzt, haben wir die indirekte und die indizierte Addressierung. Jetzt fehlt noch die direkte

Wenn wir schreiben

lds r0, 640

Dann legen wir in r0 den Wert, der an der Speicherstelle 640 liegt.

Jetzt haben wir die drei üblichen Addressierungsarten. Wenn wir jetzt von einem Register in ein Register schreiben, dann nehmen wir mov

mov r1, r0

Und wenn wir eine Konstante oder einen Direktwert nehmen, dann nehmen wir

ldi r0, 5

Also bleibt:

ld r16, X
ldd r16, Y+6
lds r16, 640
mov r16, r17
ldi r16, 5

st X, r16
std Y+6, r16
sts 640, r16

Jetzt muss man sich noch etwas merken - es gibt noch eine Einschränkung: Die indizierte Addressierung geht ausschließlich mit Y und Z.

Bei

load: Ist der Quelloperand im  Arbeitsspeicher und der Zieloperand in jedem Fall, das Ziel ein Register
store: Ist der Quelloperand in jedem Fall ein Register und der Zieloperand im Arbeitsspeicher.