mikrocontroller.net

Forum: Compiler & IDEs Frage Assembler MSP430 - Zeichenkette parsen


Autor: Иван S. (ivan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich bin Neuling in Sachen Assembler und MSP430. Ich benutze den 
Assembler, der bei MSPGCC dabei ist. Nun hat es sich ergeben, daß ich 
aus dem Flashspeicher eine Zeichenkette auslesen will. Die Zeichenkette 
besteht aus einem Starttoken "SPROGNAME", dann die Zeichen und dem 
Endtoken "EOPROGNAME". Davor ist noch ein Token ""STARTPROG". Das ganze 
soll dann via SPI ausgegeben werden, dazu soll das ganze auf den 
Kellerspeicher (Stack) gegeben werden, und zwar so, daß zu oberst auf 
dem Kellerspeicher das Starttoken, dann das erste Zeichen usw, das 
Endtoken und zu guter Letzt ein Nullbyte liegen bleiben. Ich kann also 
nicht direkt lesen und poppen, muss also die Reihenfolge der Token und 
Zeichen umdrehen. Der MSP hat eine Breite von 16Bit, meine Zeichen und 
Token haben jedoch eine Breite von 8 Bit. Wie kann ich mein Problem 
lösen? Ich habe mir folgendes zusammengebastelt, weiß aber weder ob es 
funktioniert noch ob es richtig ist. Ausserdem erscheint mir das ganze 
nicht sehr elegant. Wer weiß Rat?


.equ NULL, #0x00
.equ SPROGNAME, #0xFB
.equ STARTPROG, #0xFA
.equ EOPROGNAME, #0xFC

LoadProgN:  mov    &R10,R11                ; In R10 ist die Startadresse der Zeichenkette, R11 Hilfsregister
            mov     #NULL,R12               ; R12 (Zählregister) initialisieren.
            cmp.b   #SPROGNAME,R11          ; Zweites Byte muss das Zeichenketten-Starttoken sein
            jne     ProgError              ;
            swpb    R11                    ; Swap Bytes
            cmp.b   #STARTPROG,R11          ; Erstes Byte ist das generelle Starttoken.
            jne     ProgError              ;
LPNLabel:   inc     R10                    ; R10 inkrementieren...
            mov.b   &R10,R11               ; ...und nächste Adresse laden.
            cmp.b   #EOPROGNAME,R11         ; Ist das Ende erreicht?
            je      LPNLoaded              ; Ende erreicht
            inc     R12                    ; Zeichen zählen
            jmp     LPNLabel               ; fahre fort mit Zählen
LPNLoaded:  pop     R13                    ; SP und PC sichern
            pop     R14                    ;
            push    #NULL                   ; NULL (ist wo anders definiert)
            push    R11                    ; EOPROGNAME
LPNSPILd:   dec     R10                    ; R10 dekrementieren
            push    &R10                   ; Zeichen holen
            dec     R12                    ; Zählregister dekrementieren.
            jnz     LPNSPILd               ; Ende?
            push    #SPROGNAME              ; Starttoken pushen
            push    R14                    ; Gesicherte Werte
            push    R13                    ; zurüchschreiben
            call    SPIHandler             ; Alles über SPI ausgeben 
            ret                            ;
ProgError:  call            ErrorHandler            ;
  

Ausserdem beschäftigt mich die Frage, wann das #-Zeichen benutzt werden 
muss. Bei Sprungbefehlen und in Labels benötigt man eine vorangestellte 
# anscheinend nicht, bei sonstigen symbolischen Namen aber schon?

Mit Gruß, Iwan

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.