0xC0000005 中 0x00000005 处未处理的异常:读取位置 0x00000005 时发生访问冲突。重拨时

发布于 2024-12-13 02:03:17 字数 3945 浏览 2 评论 0原文

我的程序应该从用户那里读取一个整数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

现在产生错误的过程:

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 为偶数时不会崩溃。有什么建议吗?

My program is supposed to read an integer n from the user and then calculate all the divisors and if they are prime or not. I am using the Irvine 32 library. Now this is the weird part, when I enter in an even number my program executes as it is supposed to. When I enter in and odd number my program gets the error which is the title of this post.

My main 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

Now the Proc that has produces the error:

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

Now the line that is giving me the exact error is the following:

foo:
    ret

It is boggling my mind as to why it is crashing when I enter in an odd number for n and not crashing when n is even. Any suggestions?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

凉城凉梦凉人心 2024-12-20 02:03:17

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

It looks like you forget to pop some values from the stack. Check the number of push and pop instructions executed.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文