You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

x86汇编调用外部素数生成模块遇访问违例及栈数据恢复求助

Fixing "Access violation executing location 0x00000000" in x86 Assembly Prime Generator

Let's break down what's causing this error and how to fix it. That 0x00000000 access violation almost always means your program is trying to execute code from a null address—usually because the return address on the stack got corrupted, or you're calling an unlinked function.

Common Causes & Fixes

1. Stack Imbalance Corrupted the Return Address

Since you're pushing primes onto the stack in genprimes.asm (line 79), the most likely issue is that your stack isn't balanced after the function returns. If you push more values than you account for, or forget to restore registers/stack space in genprimes, the ret instruction will pull a garbage address (like 0x00000000) instead of the correct return point.

Fix for genprimes.asm:

Make sure your function properly manages its stack frame and doesn't overwrite the return address. Here's a corrected structure for the prime-pushing logic:

; genprimes.asm - 32-bit MASM syntax
genprimes proc
    push ebp               ; Set up stack frame
    mov ebp, esp
    push esi               ; Save non-volatile registers we'll use
    push edi

    ; --- Your existing prime generation logic here ---
    ; Assume you have:
    ; - count: number of primes found (e.g., 4 for primes <10: 2,3,5,7)
    ; - primes: array holding the prime values (32-bit integers)

    ; Push primes onto the stack (line 79 logic)
    mov ecx, count
    mov esi, offset primes
push_primes:
    cmp ecx, 0
    je done_pushing
    mov eax, [esi]
    push eax               ; Push one prime to stack
    add esi, 4             ; Move to next 32-bit integer
    dec ecx
    jmp push_primes
done_pushing:

    mov eax, count         ; Return number of primes in EAX
    pop edi                ; Restore saved registers
    pop esi
    mov esp, ebp           ; Tear down stack frame
    pop ebp
    ret                    ; Return to caller (return address is intact)
genprimes endp
Fix for Your Main Program:

After calling genprimes, you need to pop exactly the number of primes returned in EAX. Popping too many/few will break the stack. Example main code:

; Main program - 32-bit MASM syntax
extern genprimes:proc
extern printf:proc

.data
    intro db "Primes less than 10: ", 0
    num_format db "%d ", 0
    newline db 0ah, 0dh, 0

.code
main proc
    push ebp
    mov ebp, esp

    ; Print intro message
    push offset intro
    call printf
    add esp, 4

    ; Call genprimes: primes are pushed to stack, EAX = number of primes
    call genprimes
    mov ecx, eax           ; Use ECX as loop counter

print_loop:
    cmp ecx, 0
    je end_program
    pop eax                ; Pop next prime from stack
    push ecx               ; Save counter (printf clobbers ECX)
    push eax
    push offset num_format
    call printf
    add esp, 8             ; Clean up printf's arguments
    pop ecx                ; Restore counter
    dec ecx
    jmp print_loop

end_program:
    push offset newline
    call printf
    add esp, 4

    mov esp, ebp
    pop ebp
    ret
main endp
end

2. Unlinked Function

If genprimes isn't properly linked to your main program, the call genprimes instruction will jump to 0x00000000 (since the symbol isn't resolved). Double-check your linker command—make sure you include both your main object file and genprimes.obj in the link step.

Debugging Tips

  • Use a debugger like x86dbg or Visual Studio's debugger:
    1. Set a breakpoint right before call genprimes.
    2. Step into the function and verify that the return address (at [ebp+4]) doesn't get overwritten during prime generation/pushing.
    3. After the function returns, check the stack top—should be the correct return address, not a prime value.

内容的提问来源于stack exchange,提问作者Some_Dude

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:52:09