BASCOM: Arrayelement in Assember einlesen

OP #1201032
Lesenswert?

Hi!

Ich bin gerade dabei mich ein bisschen in Assembler einzuarbeiten. Damit 
ich nicht gleich alles "von Hand" machen muss, benutze ich 
Inline-Assembler in BASCOM.

Normal kannich ja Variablen so an Register übergeben:
1
LDS r21,{MeineVariable}

Jetzt habe ich aber ein Bytearray z.B. XY(8) - wie kann ich da jetzt die 
einzelnen Elemente lesen? Probier habe ich folgendes:
1
LDI r20,4
2
LDS r21,{XY+r20}

scheint aber wohl nicht zu klappen - es wird immer das erste 
Array-Element ausgelesen...
Gast #1201055
Lesenswert?

Du musst mit dem X, Y oder Z-Pointer arbeiten:

;   XL      = r26
;   XH      = r27
;   YL      = r28
;   YH      = r29
;   ZL      = r30
;   ZH      = r31

Lade die Adresse in high- und low-register:

ldi XH,HIGH(ADRESS) ; Adresse
ldi XL,LOW(ADRESS)    ;

mit

"lpm temp,X+"  liest Du Daten aus dem Flash

mit

"ld temp,X+"  aus dem RAM

Otto
OP #1201062
Lesenswert?

Okay, da war ich jetzt wohl schon auf der richtigen Spur... Hatte es 
jetzt mit
1
Loadadr XY(1) , X

gemacht, und dann mit
1
LD r21,X+

die einzelnen Werte nacheinander ausgelesen. Gibt es auch eine 
Möglichkeit explizit ein Element aus dem Array rauszupicken oder muss 
ich immer mit dem ersten anfangen und mich dann "durchkämpfen"? Also, 
wenn ich zum Beispiel das 4. Element haben wollte, muss ich jetzt so 
rangehen:
1
Loadadr XY(1) , X
2
LD r21,X+
3
LD r21,X+
4
LD r21,X+
5
LD r21,X+

Klar könnte ich bei Loadadr auch gleich das 4. Element angeben - aber 
ich kann für die Zahl ja kein Register angeben...
1
LDI r20,4
2
Loadadr XY(r20) , X      'Geht nicht
3
LD r21,X+

Gruß Jens
Gast #1201067
Lesenswert?

Wenn Du aus Data Arrays lesen möchtest, würdest Du es so machen:

DIM Data_Ptr as Word
Ptr = Loadlabel(Data_Label)
...
LDS       ZL, {Data_Ptr}
LDS       ZH, {Data_Ptr+1}
ADD       ZL, R20
ADC       ZH, R21
LPM       R18, Z
...
Data_Label:
Data 1, 2, 3, 4, 5, usw.

Wenn Du direkt adressieren willst, muss in R20/R21 die Position 
innerhalb des Data Arrays stehen, in R18 steht dann das Ergebnis. Bei 
weiterem seriellem Auslesen würde man LPM R18, Z+ schreiben, da wird 
nach jedem Lesen der Z-Pointer automatisch um eins erhöht.

Für Arrays im Ram das Equivalent zu Loadlabel und der ersten 2 LDS, 
sowie ld statt lpm verwenden.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren