2011-10-29 2 views
1

내 프로그램은 사용자로부터 n 정수를 읽고 모든 제수를 계산하고 이들이 소수인지 아닌지를 계산합니다. 나는 Irvine 32 라이브러리를 사용하고있다. 지금 이것은 이상한 부분입니다, 제가 짝수로 입력하면 프로그램이 실행됩니다. 내가 입력하고 홀수 번호를 입력하면이 프로그램의 제목 인 오류가 발생합니다.처리되지 않은 0x00000005 예외 : 0xC0000005 : 0x00000005 위치를 읽는 액세스 위반. 재 호출을 할 때

내 주요 PROC :

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 오류 발생

:

foo: 
    ret 
: 나에게 정확한 오류를주고있다

이제
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 

라인은 다음과 같다

이상한 숫자로 입력 할 때 왜 충돌하는지 내 마음이 우스꽝 스럽네 nn이 짝수 일 때 충돌하지 않습니다. 어떤 제안?

답변

2

스택에서 일부 값을 가져 오는 것을 잊어 버린 것 같습니다. 실행 된 push 및 pop 명령의 수를 확인하십시오.

+0

예, eax도 팝업해야만합니다. 고맙습니다! –