Wieso wird die Funktion übersprungen - ARM Programmieren?
Ich programmiere gerade mit ARM. Hier habe ich ein Programm, was den Inhalt von StringA in StringB kopiert (das funktioniert problemlos). Das Programm habe ich dann um die Funktion reduzieren erweitert, sodass aus dem StringB nur Zahlen extrahiert werden und diese mit einem Semikolon getrennt werden. Nun habe ich das Problem, dass wenn der Kopiervorgang beendet wurde (nullzeichen), das Programm dann in die main auf bl reduzieren springt, dann aber die Funktion überspringt und sich direkt mit pop {pc} beendet. Wo liegt mein Fehler, wieso wird die reduzieren Funktion übersprungen? // Kopieren und reduzieren .file "copyreduce.S" .text @ legt eine Textsection fuer PrgrammCode + Konstanten an .align 2 @ sorgt dafuer, dass nachfolgende Anweisungen auf einer durch 4 teilbaren Adresse liegen @ unteren 2 Bit sind 0 .global main @ nimmt das Symbol main in die globale Sysmboltabelle auf .type main,function main: push {lr} @ Ruecksprungadresse und Register sichern ldr R5, Adr_StringA ldr R6, Adr_StringB mov R0, r5 mov R1, R6 @ .. bl kopieren @ .. bl reduzieren @ .. @ bl sortieren pop {pc} kopieren: @ hier Ihr Programm zum Kopieren eines String loop_kopieren: LDRB R3, [R0], #1 STRB R3, [R1], #1 CMP R3, #0 BNE loop_kopieren BX LR reduzieren: LDR R1, Adr_StringB @ Lade die Adresse von StringB in R1 MOV R2, R1 @ Setze R2 als Schreibzeiger in StringB loop_reduzieren: LDRB R3, [R1], #1 @ Lade das aktuelle Zeichen aus StringB in R3 und inkrementiere R1 CMP R3, #0 @ Prfe, ob das Zeichen das Nullzeichen ist BEQ ende_reduzieren @ Beende die Funktion, wenn das Nullzeichen erreicht ist CMP R3, #'0' @ Prfe, ob das Zeichen eine Ziffer ist BLT skip_char @ Springe zum n¦chsten Zeichen, wenn kleiner als '0' CMP R3, #'9' BGT skip_char @ Springe zum n¦chsten Zeichen, wenn grer als '9' @ Speichere das Zeichen, wenn es eine Ziffer ist STRB R3, [R2], #1 @ Speichere die Ziffer in StringB am Schreibzeiger R2 und inkrementiere R2 MOV R3, #';' @ Lade das Semikolon in R3 STRB R3, [R2], #1 @ Fge ein Semikolon in StringB ein B loop_reduzieren @ Gehe zum n¦chsten Zeichen skip_char: B loop_reduzieren @ Gehe zum n¦chsten Zeichen ende_reduzieren: MOV R3, #0 @ Lade das Nullzeichen in R3 STRB R3, [R2] @ Setze das Nullzeichen am Ende von StringB BX LR @ Kehre zur Main-Funktion zurck Adr_StringA: .word StringA @ auf dieser Speicherstelle liegt die Adresse, @ welche auf das erste Zeichen von StringA zeigt Adr_StringB: .word StringB .Lfe1: .size main,.Lfe1-main // .data-Section fuer initialisierte Daten .data StringA: .asciz "Te 3 st 2!1" StringB: .space 256 // .comm-Section fuer nicht initialisierte Daten // .comm StringB, 256 @ Speicherbereich mit der max. Groesse eines StringA reservieren // End of File