Display MoreSIeht interessant aus. Leider verstehe ich nicht so ganz, was einige Adressierungsarten oder Befehle bedeuten.
Was meint z. B.dec R, r
und was
dec (R, r)?
Oder
dec R + r
im Gegensatz zu
dec (R + r)?
"dec X, a" berechnet die Adresse indem X und (sign extended) a addiert werden. Der Inhalt der Adresse wird dann un 1 verringert.
"dec X + a" berechnet die Adresse indem X und (zero extended) a addiert werden....
"dec (X, a)" bedeutet dass eine Adresse aus X+(sign extended) a errechnet wird und dann an der stelle eine andere Adresse geladen wird und die Speicherstelle, auf die das zeigt wird dann um 1 verringert.
(Edit2: 0x80 sign extended = 0xff80 = -128; 0x80 zero extended = 0x0080 = 128; wenn das oberste bit nicht gesetzt ist, also 0..127, dann machen beide das selbe)
Gehe ich recht in der Annahme, daß R++ bedeutet "postinkrement um 2" und bei den 16-Bit-Registern angewendet wird?
Ja, und wenn etwas in Klammern steht dann bedeutet das indirekte Adressierung, wie oben beschrieben. (und ich hatte ja auch geschrieben dass R = X,Y,S,PC und r = a,b ist).
Und noch eine abschließende Frage: Wie kopiert man den Inhalt des X-Registers in das Y-Register (oder auch S) und umgekehrt?
Mit "lea" - das ist ein operator der sehr nützlich ist, es ist die Abkürzung von load effective address. Es wird die Ziel-Adresse berechnet (wie oben) aber diese wird dann in das angegebene Register geschrieben (anstelle etwas von da zu laden/speichern). "leax y, -10" sorgt also dafür das y-10 in x geschrieben wird. (oder "leax x,-1" == "dex")
Edit:
Die Idee ist bei fast allen Computer die, dass du deine Variablen nicht an festen adressen hast sondern sie irgendwo sind, und sie über eine addition mit einer basis-adresse (z.B. in X oder Y) zu erreichen. Dann baucht man sehr oft nur ein kleiner Offset und der Opcode ist kurz. (Währen beim lda 0x1234 der opcode lang ist und auch noch nicht mal flexibel)
Zudem ist es mit solchen mitteln temporäre Variablen ganz einfach auf dem Stack zu nutzen. Beispiel:
leas s, -4 ; reserviere 4 bytes auf dem stack
lda s, 3 ; liest das letzte reservierte byte
leas s, 4 ; lösche die 4 bytes vom stack (die daten werden nicht angefasst nur der stackpointer geändert)