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

数组输入及最大值查找程序出现0xC0000005访问违例错误求助

内存访问违例问题排查与修复

错误原因分析

你遇到的0xC0000005访问违例,是数组越界访问导致的,核心问题出在最大值查找的循环逻辑中:

  • 循环终止条件错误:GreaterAgain循环里,当ecx减至0时,loop指令会先将ecx减1变为-1,随后执行imul ecx,4得到-4,此时访问Arr[-4](对应错误地址0x000FFFFE),触发内存访问违例。
  • 循环逻辑混乱:Changer标签的代码执行后,没有正确跳转回循环流程,导致ecx被错误修改,进一步加剧了越界问题。
  • 最大值查找逻辑冗余:嵌套循环的实现复杂且易出错,实际上一次遍历数组即可完成最大值查找。

修正后的代码

以下是修复后的完整代码,优化了输入逻辑并重写了最大值查找部分:

INCLUDE Irvine32.inc
.data
    Message BYTE "Enter Number ",0
    Arr DWORD 5 DUP(0)
    GreaterNum DWORD 0
.code
main PROC
    ; 输入5个数字到数组
    mov ecx, 5
    mov esi, 0          ; esi维护数组字节偏移量,初始为0
InputLoop:
    mov edx, offset Message
    call WriteString
    mov eax, 5          ; 计算当前输入序号:5 - ecx + 1
    sub eax, ecx
    inc eax
    call WriteInt
    call crlf
    call ReadInt        ; 读取用户输入到eax
    mov Arr[esi], eax   ; 存入数组对应位置
    add esi, 4          ; 偏移量加4,指向下一个DWORD元素
    loop InputLoop

    ; 查找数组最大值
    mov ecx, 5
    mov esi, 0
    mov eax, Arr[esi]   ; 初始化最大值为第一个元素
FindMaxLoop:
    add esi, 4
    cmp eax, Arr[esi]
    jge SkipUpdate      ; 当前最大值更大,跳过更新
    mov eax, Arr[esi]   ; 更新最大值
SkipUpdate:
    loop FindMaxLoop

    mov GreaterNum, eax
    call WriteInt       ; 输出最大值
    call crlf

exit
main ENDP
END main

关键修复点说明

  • 输入逻辑优化:用esi直接维护数组的字节偏移量,避免了原代码中复杂的除法计算,更简洁且不易出错。
  • 最大值查找简化:通过一次遍历数组,逐个比较元素大小并更新最大值,完全避免了嵌套循环的逻辑漏洞。
  • 循环控制正确:使用loop指令配合ecx的初始值(数组元素个数),确保循环恰好执行5次,不会出现越界访问。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 01:53:16