如何修复程序集中的“未处理的异常”错误?

时间:2019-05-07 18:35:32

标签: function assembly x86 primes masm

我写了一个函数来确定一个值是否为质数。但是当我从函数返回时,它会出现错误。
错误消息是

  

Project.exe中0x00000001的未处理异常:0xC0000005:执行访问地址0x00000001的访问冲突。

此函数应返回eax

        push ebp
        mov ebp, esp
        mov eax, [ebp+8]                ; store input value
        mov ecx, [ebp+8]                ; store input value in counter
        sub esp, 4                      ; local variable 
        sub ecx, 1                      ; avoid compare with itself
        cmp eax, 3                      ; compare with 1, 2, 3
        jbe Prime

    L1:
        cmp ecx, 3                      ; when count=3 to stop
        je NotP
        mov edx, 0                      ; clear edx to save remainder
        mov [esp-4], eax                ; save input value
        div ecx                         ; divide number
        cmp edx, 0                      ; check remainder
        je NotP                         ; if remainder=0 then not prime
        jmp Prime
        loop L1
    NotP:
        mov eax, 0
        push eax                        ; if delete this ilne still come up error
        pop ebp
        ret
    Prime:
        mov eax, 1                      
        push eax                        ; if delete this ilne still come up error
        pop ebp
        ret
    isPrime  endp

1 个答案:

答案 0 :(得分:2)

   mov [esp-4], eax                ; save input value

如果计划使用保留了空间的局部变量,则必须编写:

    mov [esp], eax                ; save input value

或者写:

    mov [ebp-4], eax              ; save input value

正确的序言/结尾是:

    push    ebp
    mov     ebp, esp
    sub     esp, 4                 ; local variable 
    mov     eax, [ebp+8]           ; store input value

    ...

NotP:
    mov     eax, 0
    pop     ebp                    ; remove local variable
    pop     ebp
    ret
Prime:
    mov     eax, 1                      
    pop     ebp                    ; remove local variable
    pop     ebp
    ret
isPrime  endp

    cmp edx, 0                      ; check remainder
    je NotP                         ; if remainder=0 then not prime
    jmp Prime
    loop L1

发现余数不为零还不足以得出数字为质数的结论!需要更多测试。目前,该loop L1指令从未执行过。
例如为了测试15,您的第一个除法运算结果为15/14,得出的余数非零,但15不是质数。

L1:
    cmp ecx, 3                      ; when count=3 to stop
    je NotP

循环的顶部也不正确!考虑测试数字7。
第一个除法是7/6并且有余数,因此循环必须继续
第二部分是7/5,有一个余数,所以循环必须继续
第三除法是7/4并且有余数,因此循环必须继续
您无需再尝试除法并得出“不是素数”的结论,但是7绝对是素数。