2017-06-03 4 views
1

Ceci est mon code pour rechercher ih une chaîne de caractères se compose d'une lettre:Revenant pointeur à la lettre dans la chaîne

selectedWords BYTE "BICYCLE" 
inputLetter BYTE 'Y' 

cld         
mov ecx, LENGTHOF selectedWords  
mov edi, offset selectedWords  
mov al, inputLetter     ;Load character to find 
repne scasb       ;Search 
jne notfound 

Mais comment retourner le pointeur à la lettre dans la chaîne?

Si je veux après changer un ltre avec un autre. C'est facile à faire si vous avez un pointeur vers la lettre en chaîne.

Répondre

1

Si repne scasb trouve l'élément, EDI des points à l'élément après le premier match. Vous devez le décrémenter pour obtenir le pointeur sur l'élément désiré.

Vous n'avez pas besoin d'effacer le drapeau de direction (cld). Il est très peu probable que le drapeau de direction soit défini sans aucune implication de votre part. Et si c'est le cas, vous devriez revenir à l'ancien statut.

INCLUDE Irvine32.inc 

.DATA 
selectedWords BYTE "BICYCLE" 
inputLetter BYTE 'Y' 

err_msg BYTE "Not found.", 0 

.CODE 
main PROC 

    mov ecx, LENGTHOF selectedWords 
    mov edi, offset selectedWords 
    mov al, inputLetter     ; Load character to find 
    repne scasb       ; Search 
    jne notfound 

    dec edi 
    mov al, [edi] 
    call WriteChar      ; Irvine32: Write a character in AL 

    exit        ; Irvine32: ExitProcess 

    notfound: 
    lea edx, err_msg 
    call WriteString     ; Irvine32: Write a null-terminated string pointed to by EDX 
    exit        ; Irvine32: ExitProcess 

main ENDP 

END main 

Si vous n'aimez pas repne scasb vous pouvez scanner le mot avec une boucle de comparaison « normale »

INCLUDE Irvine32.inc 

.DATA 
selectedWords BYTE "BICYCLE" 
inputLetter BYTE 'Y' 

err_msg BYTE "Not found.", 0 

.CODE 
main PROC 

    mov edi, offset selectedWords 
    mov ecx, LENGTHOF selectedWords 
    mov al, inputLetter 

    @@: 
    cmp [edi], al      ; Compare memory/immediate value 
    je found       ; JE = jump if equal 
    inc edi        ; Increment pointer 
    dec ecx        ; Decrement counter 
    jne @B        ; Jump back to the last @@, if ECX == 0 

    jmp notfound 

    found: 
    mov al, [edi] 
    call WriteChar      ; Irvine32: Write a character in AL 

    exit        ; Irvine32: ExitProcess 

    notfound: 
    lea edx, err_msg 
    call WriteString     ; Irvine32: Write a null-terminated string pointed to by EDX 
    exit        ; Irvine32: ExitProcess 

main ENDP 

END main 
1

Si vous lisez la documentation pour REP et SCASB, vous verrez que SCAS met à jour edi. Ainsi, l'emplacement du caractère correspondant est enregistré dans EDI.
Tout ce que vous avez à faire est de retourner EDI si ZF=1 et retourner 0 si ZF<>1.

cld         
    mov ecx, LENGTHOF selectedWords  
    mov edi, offset selectedWords  
    mov al, inputLetter     ;Load character to find 
    repne scasb       ;Search 
    jne notfound 
found: 
    mov eax,edi     ;return the address of the match. 
    ret 
notfound: 
    xor eax,eax     ;return 0 aka not found as address. 
    ret 
+0

Je fais jeu Hangman donc je dois chercher dans le monde si avoir une lettre dans sa .. – SakaSerbia