2010-06-22 4 views
0

Quelqu'un peut-il indiquer pourquoi? Je ne peux pas voir le problème.ARM - Boucle infinie lors de la recherche de chaîne

Chaîne à la recherche: « aassaas »

Chaîne à rechercher avec: « comme »

SEARCHSTRING: 
    STMFD SP!, {R4-R7, LR} 

    MOV R6, #0    @Matches found 
    MOV R3, #0    @Placeholder  

LOOP: LDRB R4, [R0]  @R4 = String to search 
    LDRB R5, [R1]   @R5 = String to search with 

    CMP R4, R5    @Do they match? 
    ADDEQ R3, R3, #1   @If yes, increase placeholder 
    LDREQB R4, [R0, #1]!  @Get next char 
    LDREQB R5, [R1, #1]!  @Get next char 
    BLNE RESET    @If not, reset placeholder and strings. 
          @R0 is nevertheless initial pos+1 
    CMP R5, #0    @Is string to search with at the end? 
    ADDEQ R6, R6, #1   @If so, add +1 to matches 
    BLEQ RESET    @Reset placeholder and strings. 

    CMP R4, #0    @Is the string to search finished? 
    BNE LOOP     @If not, start over. 

    MOV R0, R6    @If so, move answer into R0. 
    LDMFD SP!, {R4-R7, PC} @Jump back. 

RESET: 
    STMFD SP!, {LR} 

    CMP R3, #0    @Is the placeholder at 0? (initial position) 
    SUBNE R0, R0, R3   @If not, subtract from String to search pos 
    SUBNE R1, R1, R3   @And string to be searched pos 
    ADDNE R0, R0, #1   @Increment string to search+1 so we don't start at the same spot 
    MOVNE R3, #0    @Empty the placeholder 

    LDMFD SP!, {PC}   @Jump back 

Répondre

2

Je ne comprends pas pourquoi), vous écrivez ceci en assembleur au lieu de C, et b) pourquoi vous n'utilisez pas une routine basée sur strstr. Le scénario le plus probable est qu'il s'agit d'un problème de devoirs ou d'une autre forme d'apprentissage, alors je ne veux pas en donner trop. En tout cas, il y a quelques problèmes que j'ai remarqués. Le premier bit je remarque est dans la routine RESET:

RESET: 
    STMFD SP!, {LR} 

    CMP R3, #0    @Is the placeholder at 0? (initial position) 
    SUBNE R0, R0, R3   @If not, subtract from String to search pos 
    SUBNE R1, R1, R3   @And string to be searched pos 
    ADDNE R0, R0, #1   @Increment string to search+1 so we don't start at the same spot 
    MOVNE R3, #0    @Empty the placeholder 

    LDMFD SP!, {PC}   @Jump back 

Le CMP est inutile - considérer ce que l'effet des SUBNE appels sera si R3 est 0, et vous verrez que vous pouvez effectuer les soustractions sans conditions . Vous voulez exécuter ADD R0, R0, #1 sans condition - en fait, c'est une grande partie de la raison pour laquelle vous avez une boucle infinie. Si vous arrivez au sous-programme RESET, et R3 est 0, alors il ne change aucun état. Je remarque également que la paire STMFD/LDMFD n'est vraiment pas nécessaire - LR ne sera pas modifié dans ce sous-programme, il n'a donc pas besoin d'aller sur la pile.

Ensuite, je remarque que vous n'êtes pas assez prudent sur le moment de terminer votre boucle. Considérez ce qui se passe si vous donnez deux chaînes vides en tant qu'arguments à SEARCHSTRING. Appelez-le avec deux chaînes vides comme arguments, et faites un seul pas dans votre code d'assemblage pour voir le problème. La forme générale d'une boucle for, lors de la compilation à l'assemblage, sera quelque chose comme:

for(initial; comparison; increment) { 
    body; 
} 

INITIAL: 
    MOV R0, #0   @initialize variables 
    B CONDITION  @jump to condition check 
BODY: 
    LDR R1, [R0] 
INCREMENT:    @really, part of the for-loop body. 
    ADD R0, R0, #1 
CONDITION: 
    CMP BLAH, BLAH  @test-condition 
    BLT BODY   @restart loop if condition indicates we should do so. 

Espérons que cela vous aidera à réorganiser le code d'une manière plus simple.

+0

Merci pour les suggestions! C'est en effet un problème de devoirs. J'ai depuis posté la question résolue en éliminant la commande ADDNE conditionnelle en le changeant en ADD. Depuis que j'ai lu ceci, j'ai remarqué que j'avais vraiment des défauts flagrants dans la conception. Ce que je n'ai pas montré était une routine séparée qui filtrait les chaînes vides parce que notre professeur voulait que quelque chose de spécial se produise si la chaîne est vide. Merci pour les conseils! Bien que l'enseignant n'ait pas commenté les défauts que vous avez montrés, je vais refactoriser mon code de toute façon! – IAE