x86汇编实现输入数值求和平均时访问非法内存崩溃问题
问题原因梳理
- 输入循环执行过程中你用ECX寄存器统计了输入元素的个数,但循环结束后没有将ECX的值回写到
elementCnt变量,后续重新执行mov ecx, elementCnt时,ECX会被赋值为elementCnt的初始值0。进入sumAndAverage函数后loop指令会先将ECX减1得到0xFFFFFFFF,执行add eax, [ebx + ecx]时计算出来的内存地址远超出数组的合法范围,直接触发权限错误。 inputArray是DWORD类型数组,每个元素占4字节,你读取数组元素时使用的寻址规则[ebx + ecx]没有将索引ECX乘以4,就算ECX值正确,计算得到的操作数地址也是错误的,同样会触发越界访问。sumAndAverage函数中用于累加求和的EAX寄存器没有提前初始化为0,且你在函数开头执行了push eax操作,会将未初始化的EAX值压栈,即使寻址问题修复,求和结果也会出错,但该问题不是本次崩溃的直接诱因。- 你将输入终止标记
-1也存入了数组,即使崩溃问题全部修复,求和和平均值计算时也会把这个终止值纳入统计,导致最终结果不符合预期。
内容的提问来源于stack exchange,提问作者E. Huckabee
相关产品推荐
相关产品推荐

