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.