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







Zitieren

Lesezeichen