MASM随机数数组排序程序无效内存访问排查求助
MASM程序内存访问违例(0xC0000005)排查
错误本质
你碰到的0xC0000005: Access violation executing location 0x00000064,说白了就是程序跑去执行数据内存了——0x64是十进制100,正好在你生成的随机数范围内,说明call displayListDescending时,程序跳转到了数组里的某个随机数地址,而非正确的过程入口。
重点排查displayListDescending的几个点
1. 过程定义与调用的拼写/格式
- 先检查过程的定义是不是标准格式:
调用时displayListDescending PROC ; 你的代码 displayListDescending ENDPcall 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
相关产品推荐
相关产品推荐

