数组输入及最大值查找程序出现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
相关产品推荐
相关产品推荐

