Forum: Mikrocontroller und Digitale Elektronik BASCOM: Arrayelement in Assember einlesen


von Jens S. (djstorm)


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...

von Otto (Gast)


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

von Jens S. (djstorm)


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

von MWS (Gast)


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.

von spess53 (Gast)


Lesenswert?

Hi

>Gibt es auch eine Möglichkeit explizit ein Element aus dem Array >rauszupicken 
oder muss...

Ja.  Z.B. 'LDD rxy,Y+1' oder 'LDD rxy, Z+2'. Geht mit einm Offset von 
0..63.

MfG Spess

von Jens S. (djstorm)


Lesenswert?

@spess:
'LDD rxy, Z+2' ist ja schon mal gut, aber statt der 2 kann ich ja nicht 
mein Register r22 (in der die Nummer des Elements steht) statt der 2 
schreiben...

Gruß

Jens

von spess53 (Gast)


Lesenswert?

Hi

>aber statt der 2 kann ich ja nicht mein Register r22...

Nein. Das geht nur über Addition:

  ldi rxx,0         ; für Übertrag
  add XL,r22
  adc XH,rxx

MfG Spess

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.