2010-07-17 7 views
1

J'ai un problème de comptage de la longueur d'une chaîne. Je reçois toujours un nombre comme 2432, tu me passes une chaîne comme "abc".Quelques questions sur le comptage de longueur de chaîne

Je pense que le problème est dans cette ligne

mov bl, byte [esi] 

mais je ne sais pas pourquoi. Peut-être que c'est quelque chose avec la longueur du caractère en bits?

Le problème peut-il être un système d'exploitation 64 bits ou un processeur dual core? (dont je doute quelque peu, car je pense que la première ligne "bits 32" devrait résoudre le problème). PS: C'est un exercice, c'est pourquoi j'ai besoin de déterminer la longueur de la chaîne comme ceci.

Le code:

bits 32 
extern _printf 
extern _scanf 
global _main 

section .data 
number_frmt db 10,"%d",10,0 
enter_str db "Enter some string: ", 10,0 
string_frmt db "%s", 0 

section .bss 
entered_string resb 100 

section .text 

_main: 
    pushad 

    push dword enter_str 
    call _printf 
    add esp, 4 

    push dword entered_string 
    push dword string_frmt 
    call _scanf 
    add esp, 4 ;leave the entered string in the stack 

    call count ; count it and put the result to eax 

    push dword eax 
    push dword number_frmt 
    call _printf 
    add esp, 12 

    popad 
    ret 

count: 
    push esi ;save it 
    push ebx ;save it 
    mov eax, 0 ;init eax=0 
    mov esi, [esp+12] ;put the entered string to esi 

.loop: 
    mov bl, byte [esi] ;get the first char 
    inc eax    ;eax++ 
    add esi,1   ;point to next char 
    cmp bl,10   ;is it new line? 
    jne .loop   ;if not loop 
    dec eax    ;eax-- (because of newline at the end) 
    pop ebx    ;retrieve ebx 
    pop esi    ;retrieve esi 
    ret 

Répondre

4
cmp bl,10   ;is it new line? 

devrait être

cmp bl,0 

car c/C++ chaînes sont à chaque fois terminées/terminée par un 0, vous avez en fait recherché une position aléatoire dans la mémoire où le prochain 10 est.

1

L'utilisation de scanf n'est probablement pas une bonne chose car cela crée de la confusion, changez cela avec get, les nouvelles lignes sont aussi des caractères valides, et devraient être comptées comme faisant partie de votre compte. Les chaînes sont terminées par NUL (automatiquement)

count: 
    push esi ;save it 
    push ebx ;save it 
    xor eax, eax; initialize it to zero 
    mov esi, [esp+12] ;put the entered string to esi 

.loop: 
    mov bl, byte [esi] ;get the first char 

    cmp bl, bl   ;set the flags 
    jz .out   ;nul character 

    inc eax 
    jmp .loop 

    pop ebx    ;retrieve ebx 
    pop esi    ;retrieve esi 

    ret