80X86汇编语言实现数组反转:程序编写求助
修正后的80X86汇编程序(含两种实现方式)
问题分析
原代码存在几个关键问题:
- 数组定义错误:
array1 DWORD 10,25,56,80,3 DUP (?)会在5个初始元素后额外生成5个空DWORD,导致数组长度不符合预期,应去掉DUP (?)。 - 反转过程未使用传入参数:reverse过程硬编码了长度
5,没有利用主程序传入的数组地址和长度,不符合“仅能获取数组长度”的要求。 - 输出逻辑错误:仅尝试输出
eax的值,但eax在reverse中被pushad/popad恢复原值,且反转后的数组需要逐个元素输出,而非单个数值。
方法1:交换元素实现反转(优化版)
该版本修复原逻辑,使用传入的数组地址和长度参数,完成数组反转后逐个输出元素:
.586 .MODEL FLAT INCLUDE io.h .stack 4096 .DATA ; 修正数组定义,去掉多余的DUP (?) array1 DWORD 10,25,56,80,3 size1 DWORD 5 outputLbl BYTE "反转后的数组:", 0 result BYTE 11 DUP (?), 0Ah, 0 ; 加上换行符方便输出每个元素 .CODE _MainProc PROC mov eax, size1 ; 将数组长度存入eax作为参数 lea ebx, array1 ; 将数组地址存入ebx作为参数 call reverse ; 遍历反转后的数组,逐个输出元素 mov ecx, size1 lea esi, array1 print_loop: mov eax, [esi] dtoa result, eax output outputLbl, result add esi, 4 loop print_loop mov eax, 0 ret _MainProc ENDP ; reverse过程:接收参数 - ebx=数组地址,eax=数组长度 reverse PROC pushad mov ecx, eax ; ecx = 数组长度,用于计算循环次数 shr ecx, 1 ; 循环次数 = 长度/2(整数除法) mov esi, 0 ; 起始索引 mov edi, eax ; 结束索引 = 长度-1 dec edi swap_loop: ; 交换array[esi]和array[edi] mov edx, [ebx + esi*4] mov eax, [ebx + edi*4] mov [ebx + esi*4], eax mov [ebx + edi*4], edx inc esi dec edi loop swap_loop popad ret reverse ENDP END
方法2:使用Push/Pop实现反转
利用栈的“后进先出”特性,先将数组元素逐个压栈,再弹出存回数组完成反转:
.586 .MODEL FLAT INCLUDE io.h .stack 4096 .DATA array1 DWORD 10,25,56,80,3 size1 DWORD 5 outputLbl BYTE "反转后的数组:", 0 result BYTE 11 DUP (?), 0Ah, 0 .CODE _MainProc PROC mov ecx, size1 lea esi, array1 ; 先将所有元素压入栈 push_loop: push [esi] add esi, 4 loop push_loop ; 再将栈中元素弹出,存回数组 mov ecx, size1 lea esi, array1 pop_loop: pop [esi] add esi, 4 loop pop_loop ; 输出反转后的数组 mov ecx, size1 lea esi, array1 print_loop: mov eax, [esi] dtoa result, eax output outputLbl, result add esi, 4 loop print_loop mov eax, 0 ret _MainProc ENDP END
内容的提问来源于stack exchange,提问作者Yang Weng
相关产品推荐
相关产品推荐

