汇编程序循环提前退出,D数组未按要求填充问题排查
汇编代码修复:D数组未正确填充奇数索引元素
问题分析
你的代码执行完偶数索引元素(1、3、5)的拷贝后,执行mov si, 1就直接触发退出指令了,完全没处理奇数索引的元素(2、4)。原代码的循环逻辑混乱,用cx控制循环次数的方式和si的步长逻辑冲突,而且没有为奇数索引的拷贝设置循环流程。
修复后的代码
assume ds:data,cs:code data segment S db 1,2,3,4,5 len equ $-S D db len dup(0) data ends code segment start: mov ax, data mov ds, ax mov si, 0 mov di, 0 ; 处理偶数索引元素(si从0开始,步长2) copy_even: cmp si, len jge copy_odd ; si超过数组长度,跳转到处理奇数索引的循环 mov al, S[si] mov D[di], al inc di add si, 2 jmp copy_even ; 处理奇数索引元素(si从1开始,步长2) copy_odd: mov si, 1 copy_odd_loop: cmp si, len jge exit_program ; si超过数组长度,跳转到退出 mov al, S[si] mov D[di], al inc di add si, 2 jmp copy_odd_loop exit_program: mov ax, 4C00h int 21h code ends end start
关键修改说明
- 拆分出两个独立循环:
copy_even专门处理偶数索引,copy_odd_loop处理奇数索引,逻辑更清晰 - 用
si和len的比较直接控制循环终止条件,去掉冗余的cx判断,避免逻辑冲突 - 处理完偶数索引后,自动进入奇数索引的循环,执行完所有元素拷贝后才触发程序退出
这样运行后,D数组就能得到预期的1,3,5,2,4。
内容的提问来源于stack exchange,提问作者luisa2002
相关产品推荐
相关产品推荐

