So was in der Richtung?
Für avr-as
Code:
.arch atmega8
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.section .progmem.data,"a",@progbits
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.type STR_1, @object
.size STR_1, 8
STR_1:
.string "blubb 1"
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.type STR_2, @object
.size STR_2, 10
STR_2:
.string "blubber 2"
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.type labels, @object
.size labels, 12
labels:
.word pm(.LABEL_1)
.word STR_1
.word pm(.LABEL_2)
.word STR_2
; ...
.word 0
.word -1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; my_strcmp: Vergleiche zwei Strings
; r25:r24 ist Adresse eines Strings im RAM
; r23:r22 ist Adresse eines Strings im FLASH
; ret=r24=0: ungleich
; ret=r24=1: gleich
; veränderte Register: 24, 25, X, Z
.text
.global my_strcmp
.type my_strcmp, @function
my_strcmp:
movw r26,r24
movw r30,r22
0:
; 1 Zeichen aus RAM
ld r25, X+
; 1 Zeichen aus FLASH
lpm r24, Z+
; vergleichen
cp r25,r24
brne 0f
; bei Gleichheit: ist String zu Ende?
tst r25
; nein: weiter vergleichen
brne 0b
; ja: Übereinstimmung
ldi r24,lo8(1)
ret
0:
; bei Ungleichheit: return 0
ldi r24,lo8(0)
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; jump_if: Vergleicht den String cmd im RAM mit den
; Strings STR_1, STR_2, ... ausm Flash und springt bei
; Übereinstimmung zu .LABEL_1 bzw LABEL_2 bzw ...
; ret=r24=0: cmd nicht gefunden
; ret=r24=1: cmd gefunden und ausgeführt
; Veränderte Register: 22 -- 31
.text
.global jump_if
.type jump_if, @function
jump_if:
ldi r28,lo8(labels)
ldi r29,hi8(labels)
.loop
movw r30,r28
adiw r30,2
; Adresse eines Strings ausm Flash nach r23:r22
lpm r22, Z+
lpm r23, Z
; Ende der Liste? (cmd nicht gefunden)
ldi r24,hi8(-1)
cpi r22,lo8(-1)
cpc r23,r24
breq .not_found
; Zeiger auf labels 1 weiter
adiw r28,4
; Adresse von cmd nach r25:r24
ldi r24,lo8(cmd)
ldi r25,hi8(cmd)
; Vergleichen von cmd mit STR_n
rcall my_strcmp
tst r24
; keine Übereinstimmung (r24=0): weiter suchen
breq .loop
; Gefunden: Sprungadresse laden und indirekter Sprung
movw r30,r28
lpm r24, Z+
lpm r25, Z
push r24
push r25
ret
.LABEL_1:
; Code fuer STR_1
rjmp .done
.LABEL_2:
; Code fuer STR_2
rjmp .done
.not_found:
; Code fuer cmd nicht gefunden
ldi r24,lo8(0)
.done:
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.comm cmd,20,1
Lesezeichen