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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 15:50:50