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

汇编语言数组遍历异常:无法读取后续元素,仅获取首个元素

问题分析与修正方案

核心错误点

  • 未间接寻址读取元素:原代码中mov eax, ebx是把数组元素的内存地址存入eax,而非元素的实际数值,必须用mov eax, [ebx]通过地址间接取值。
  • 终止条件逻辑错误:直接拿内存地址ebx和终止数值15151515比较,地址与数值类型不匹配,永远不会触发终止。需先取出元素值再判断是否等于终止值,或通过数组长度控制循环次数。
  • 冗余的寄存器清零:循环内的mov eax, 0和mov ebx, 0会破坏后续循环所需的地址与数值,完全可以删除。

修正后的代码

.386
.model flat,stdcall
.stack 4096
ExitProcess proto,dwExitCode:dword

.data 
skaic DWORD 15,20,12,11,15151515
suma DWORD ?
.code

main proc
mov ecx, 0  ; 偏移量初始化为0,每个DWORD占4字节

l1:
    mov ebx, skaic   ; 取数组首地址
    add ebx, ecx     ; 计算当前元素的地址:首地址+偏移量
    mov eax, [ebx]   ; 间接寻址,取出当前元素的数值
    
    cmp eax, 15151515; 判断是否为终止元素
    je endl1

    ; 筛选两位数:大于9且小于等于99
    cmp eax, 9
    jng skip_add      ; 小于等于9,跳过累加
    cmp eax, 99
    jg skip_add       ; 大于99,跳过累加
    
    add suma, eax     ; 符合条件,累加到suma

skip_add:
    add ecx, 4        ; 偏移量+4,指向数组中下一个元素
    jmp l1

endl1:
    invoke ExitProcess,0
main endp
end main

额外说明

修正后的代码补充了两位数的完整判断逻辑(原代码只判断了大于9,缺少小于等于99的判断),确保只有10-99之间的数值会被累加。同时用元素值判断终止,逻辑更准确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 22:25:15