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