Необработанное исключение в 0x00000005 в: 0xC0000005: Место чтения нарушения доступа 0x00000005. при повторном вызове - PullRequest
1 голос
/ 29 октября 2011

Моя программа должна прочитать целое число n от пользователя, а затем вычислить все делители и, если они простые или нет.Я использую библиотеку Irvine 32.Теперь это странная часть, когда я ввожу четное число, моя программа выполняется так, как это должно быть.Когда я ввожу нечетное число, моя программа получает ошибку, которая является названием этого поста.

Мой основной процесс:

main PROC
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; This block displays greeting and newline;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mov edx, OFFSET greeting  
call Writestring
call Crlf   

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; This block gets the integer from the user;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
call GetInt 
call Crlf

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; This block gets calculates the divsiors and prime divisors.;
; It then puts them in to an array to get ready to display.  ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
call CalcDivisors

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; This block displays the results to the screen.             ;
; in an n-1 by 3 table.                                      ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
call Display_Results

exit
main ENDP

Теперь Proc, который выдал ошибку:

CalcDivisors PROC uses eax ebx ecx edx esi edi
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Function calculates divisors then pushes them on to an array;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


mov eax,0
    mov ecx,0
    mov ebx,0
    mov edx,0
    mov esi,0
    mov edi,0

    mov ecx,n
    sub ecx,1
    mov eax,n
    mov ebx,divisors
    mov esi,OFFSET prime_arr
    mov edi,OFFSET div_arr
    push eax    

    Calc_Div:
             call dumpregs
             div ebx
             call dumpregs
             cmp edx,0
             jz Calc_Prime_Div
             inc ebx
             mov edx,0
             mov eax,n
             loop Calc_Div

    Calc_Prime_Div:
                    cmp ebx,2
                    jz Push_2_array


                    push ebx
                    push ecx

                    mov eax,0
                    mov eax,ebx
                    mov ecx,ebx
                    mov divisor_counter,ebx
                    sub ecx,2
                    mov ebx,0
                    mov ebx,prime_divisors


                    P1:
                       call dumpregs
                       div ebx
                       call dumpregs
                       cmp edx,0
                       jz Push_div_array
                       inc ebx
                       mov eax,divisor_counter
                       mov edx,0
                       loop P1

     jmp Push_prime_array

     Jump_above:
                call dumpregs
                loop Calc_div
                call dumpregs
                jmp foo

     Push_prime_array:
                      pop ecx
                      pop ebx
                      mov [esi],ebx
                      mov eax,[esi]
                      call writedec
                      add esi,4
                      mov eax,0
                      mov eax,n
                      call dumpregs
                      inc ebx
                      call dumpregs
                      jmp jump_above
                      call dumpregs
     Push_div_array:
                      pop ecx
                      pop ebx
                      mov [edi],ebx
                      mov eax,[edi]
                      call writedec
                      add edi,4
                      mov eax,0
                      mov eax,n
                      call dumpregs
                      inc ebx
                      jmp Jump_above
     Push_2_array:
                  mov [esi],ebx
                  add esi,4
                  inc ebx
                  pop eax
                  jmp Jump_above
      foo:
          ret

CalcDivisors ENDP

Теперь строка, сообщающая мне точную ошибку, выглядит следующим образом:

foo:
    ret

Я не могу понять, почему происходит сбой при вводе нечетного числа для n и не падает, когда n четный.Есть предложения?

1 Ответ

2 голосов
/ 29 октября 2011

Похоже, вы забыли извлечь некоторые значения из стека.Проверьте количество выполненных команд push и pop.

...