0x00000005处的未处理异常:0xC0000005:访问冲突读取位置0x00000005。进行转接时

时间:2011-10-29 06:34:41

标签: visual-studio-2010 assembly x86 nasm masm

我的程序应该从用户读取整数 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 个答案:

答案 0 :(得分:2)

看起来您忘记从堆栈中弹出一些值。检查执行的推送和弹出指令的数量。