Forum: Compiler & IDEs Frage Assembler MSP430 - Zeichenkette parsen


von Иван S. (ivan)


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?

1
.equ NULL, #0x00
2
.equ SPROGNAME, #0xFB
3
.equ STARTPROG, #0xFA
4
.equ EOPROGNAME, #0xFC
5
6
LoadProgN:  mov    &R10,R11                ; In R10 ist die Startadresse der Zeichenkette, R11 Hilfsregister
7
            mov     #NULL,R12               ; R12 (Zählregister) initialisieren.
8
            cmp.b   #SPROGNAME,R11          ; Zweites Byte muss das Zeichenketten-Starttoken sein
9
            jne     ProgError              ;
10
            swpb    R11                    ; Swap Bytes
11
            cmp.b   #STARTPROG,R11          ; Erstes Byte ist das generelle Starttoken.
12
            jne     ProgError              ;
13
LPNLabel:   inc     R10                    ; R10 inkrementieren...
14
            mov.b   &R10,R11               ; ...und nächste Adresse laden.
15
            cmp.b   #EOPROGNAME,R11         ; Ist das Ende erreicht?
16
            je      LPNLoaded              ; Ende erreicht
17
            inc     R12                    ; Zeichen zählen
18
            jmp     LPNLabel               ; fahre fort mit Zählen
19
LPNLoaded:  pop     R13                    ; SP und PC sichern
20
            pop     R14                    ;
21
            push    #NULL                   ; NULL (ist wo anders definiert)
22
            push    R11                    ; EOPROGNAME
23
LPNSPILd:   dec     R10                    ; R10 dekrementieren
24
            push    &R10                   ; Zeichen holen
25
            dec     R12                    ; Zählregister dekrementieren.
26
            jnz     LPNSPILd               ; Ende?
27
            push    #SPROGNAME              ; Starttoken pushen
28
            push    R14                    ; Gesicherte Werte
29
            push    R13                    ; zurüchschreiben
30
            call    SPIHandler             ; Alles über SPI ausgeben 
31
            ret                            ;
32
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

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.