x86汇编问题:已排序数组无法正确获取最大值
问题分析与修正方案
核心问题:ECX参数设置完全错误
你误解了LENGTHOF的作用——它返回的是数组的元素个数,不是字节数。你用LENGTHOF Array1-4直接把元素总数减4,会导致循环次数完全偏离:
- 如果数组元素个数≤4,ECX会变成负数(汇编中按无符号数处理成超大值),循环逻辑彻底混乱;
- 即使元素数更多,也会跳过大量元素,根本遍历不到真正的最大值所在位置。
两种修正路径
路径1:直接利用已排序特性(最省事)
既然已经完成了从小到大的冒泡排序,最大值必然是数组的最后一个元素,直接通过内存寻址获取即可,不需要调用getLargest:
; 获取Array1的最大值(DWORD数组) mov eax, Array1[(LENGTHOF Array1 - 1) * 4] ; 获取Array2的最大值 mov eax, Array2[(LENGTHOF Array2 - 1) * 4]
路径2:修复getLargest的循环参数
如果一定要保留getLargest过程,需要把ECX设置为元素个数减1(从第二个元素开始和当前最大值比较):
; 调用getLargest前的ECX设置 mov ecx, LENGTHOF Array1 - 1 ; 传入数组首地址 mov esi, OFFSET Array1 call getLargest
同时确保getLargest的循环逻辑正确:初始化最大值为数组第一个元素,然后逐个遍历后续元素比较更新。
错误结果的原因
当前ECX参数导致循环要么提前终止,要么越界访问无关内存,所以拿到的是随机内存值而非数组真正最大值。比如Array2实际最大值是FFFFFFFFh,你得到的7A4E96C2h就是越界读取的无关数据。
内容的提问来源于stack exchange,提问作者Kasizah
相关产品推荐
相关产品推荐

