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