2015-03-08 1 views
-1

Я конвертирую строку из чисел в целое число. Пользователь вводит 10 строк (по одной строке за раз), а строка хранится как число. Когда пользователь вводит не номер в строку, программа улавливает ошибку и просит пользователя повторно ввести строку. Но когда программа ловит ошибку, она переходит к тому, чтобы пользователь вводил другую строку, но затем он сбой. Любые идеи почему?Сбой программы при проверке ввода пользователя, что происходит?

;getString Macro 
getString MACRO buffer, buffer1, buffer2 

mov  edx, OFFSET buffer 
call WriteString 

mov  edx, OFFSET buffer1 
mov  ecx, (SIZEOF buffer1) - 1 
call ReadString 
mov  buffer2, eax 

ENDM 
;--------------------------------------------------------------- 
;ReadVal Procedure - 
;Receives: No parameters 
;Returns: None 
;Preconditions: None 
;--------------------------------------------------------------- 
    ReadVal  PROC 
    push ebp 
    mov  ebp, esp 
    mov  ecx, 10  ;set the outer loop 

L1: 
    pushad 
    getString EntNum, Numstr, [ebp + 8] 
    mov  ecx, [ebp + 8] 
    mov  esi, [ebp + 12]  ; points to the user's number 
    mov  edi, [ebp + 24]  ; will store the user's string as a number 
    cld 

counter: 
    lodsb 
    cmp  ecx, 0 
    je  continue 
    cmp  al, 48 
    jl  badnum 
    cmp  al, 57 
    jg  badnum 
    jmp  store 

badnum: 
    mov  edx, [ebp + 20] 
    call WriteString 
    call CrLf 
    jmp  L1 

store: 
    sub  al, 48 
    stosb 
    loop counter 

    popad 
    cmp  ecx, 0  ;stop the outer loop 
    je  continue 
    loop L1 

continue: 
    pop  ebp 


    RET  20 
ReadVal  ENDP 
+0

Например, вы переходите к L1, который снова выполняет pushad, чтобы вы могли разбалансировать стек. Научитесь использовать отладчик. – Jester

+0

Спасибо, что была проблема – user2466886

ответ

0

Недействительный входной ловушка также толкал регистры в стек, что вызывало неуравновешенность.