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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 22:45:31