Некоторые вопросы о подсчете длины строки - PullRequest
1 голос
/ 17 июля 2010

У меня проблема с подсчетом длины строки. Я всегда получаю какое-то число, например, 2432, а я передаю строку, например, «abc».

Я думаю, что проблема в этой строке

mov bl, byte [esi]

но я не знаю почему. Может быть, это что-то с длиной символа в битах?

Может ли быть проблема в 64-битной операционной системе или двухъядерном процессоре? (в чем я почему-то сомневаюсь, потому что я думаю, что первая строка «биты 32» должна решить проблему).

PS .: Это упражнение, поэтому мне нужно определить длину строки следующим образом.

код:

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

Ответы [ 2 ]

4 голосов
/ 17 июля 2010
cmp bl,10           ;is it new line?

должно быть

cmp bl,0

потому что строки c / c ++ всегда заканчиваются / заканчиваются на 0, так что вы фактически искали случайную позицию в памяти, где находятся следующие 10.

1 голос
/ 17 июля 2010

Использование scanf, вероятно, не очень хорошая вещь, так как это путает вопросы, переключайте это с помощью get, новые строки также являются действительными символами и должны учитываться как часть вашего счета.Строки обнуляются (автоматически)

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
...