mikrocontroller.net

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


Autor: Jens Schmitt (Firma: eXtensive media) (djstorm)
Datum:

Bewertung
0 lesenswert
nicht 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:
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:
LDI r20,4
LDS r21,{XY+r20}

scheint aber wohl nicht zu klappen - es wird immer das erste 
Array-Element ausgelesen...

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jens Schmitt (Firma: eXtensive media) (djstorm)
Datum:

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

gemacht, und dann mit
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:
Loadadr XY(1) , X
LD r21,X+
LD r21,X+
LD r21,X+
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...
LDI r20,4
Loadadr XY(r20) , X      'Geht nicht
LD r21,X+

Gruß Jens

Autor: MWS (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jens Schmitt (Firma: eXtensive media) (djstorm)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.