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

MASM随机数数组排序程序无效内存访问排查求助

MASM程序内存访问违例(0xC0000005)排查

错误本质

你碰到的0xC0000005: Access violation executing location 0x00000064,说白了就是程序跑去执行数据内存了——0x64是十进制100,正好在你生成的随机数范围内,说明call displayListDescending时,程序跳转到了数组里的某个随机数地址,而非正确的过程入口。

重点排查displayListDescending的几个点

1. 过程定义与调用的拼写/格式

  • 先检查过程的定义是不是标准格式:
    displayListDescending PROC
        ; 你的代码
    displayListDescending ENDP
    
    调用时call displayListDescending的名字必须和定义完全一致(MASM大小写不敏感,但拼写错一个字母都不行),否则链接器找不到正确的过程地址,可能误把某个数据地址绑过来。
  • 如果过程在不同代码段,记得加FAR修饰(比如displayListDescending PROC FAR),段内/段间跳转不匹配也会导致地址错误。

2. 参数传递错误

  • 调用这个过程时,你是不是传了数组元素的值,而非数组的首地址?比如错误地写了call displayListDescending, [esi](取esi指向的元素值),正确应该是call displayListDescending, esi(传数组首地址)。要是传了元素值(比如100=0x64),过程里就会把这个值当地址用,直接触发执行错误。
  • 过程内部访问数组时,必须用基址+偏移的方式(比如mov eax, [ebx+ecx*4]),别直接把元素值当成内存地址来用。

3. 栈平衡问题

  • 过程里用了push/pop的话,必须保证数量一致,不然ret指令会从栈里取出错误的地址(大概率是数据区的地址)。比如push了3个寄存器,就得pop3个;或者用enter/leave指令自动维护栈帧,不容易出错。
  • 如果传递了参数(比如数组长度),过程里要正确用[ebp+8]这类方式访问栈上的参数,别乱读栈里的其他区域。

4. 数组越界的隐性影响

  • 虽然你怀疑是显示过程的问题,但也要确认数组分配的空间够不够:比如用户输入200个元素,数组得分配200*4=800字节(DWORD类型)。要是越界写入,会直接覆盖栈里的过程返回地址或者代码段信息,后续跳转自然就错了。

调试技巧

  • 用Visual Studio调试器,在call displayListDescending那行设断点,运行后看EIP寄存器的值,确认是不是指向displayListDescending的正确入口。
  • 查看栈帧,检查传递的参数(数组地址、元素数量)是不是有效的内存地址,有没有传错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 23:55:17