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

x86 DOS环境汇编数组求和代码无输出,调试时程序退出求助

问题分析与修复方案

这段x86汇编代码运行后无输出直接退出,核心是存在几处栈操作、内存访问和标签定义的关键错误,以下是具体问题及修复方法:

1. arraysum过程中多余的栈弹出操作

调用sum过程时,sum已经通过ret 4自动清理了栈上的两个参数(共4字节),但原代码额外执行了pop word ptr [di]和pop word ptr [si],这会导致栈指针严重错位,破坏后续函数调用的栈帧,直接引发程序崩溃。
修复:删除这两行多余的pop指令。

2. printarray过程中内存步长错误

数组元素是dw(双字节类型),但原代码用inc si每次只移动1字节,会导致每次访问的是数组元素的低字节和下一个元素的高字节,属于非法内存访问,进而导致程序异常退出。
修复:将inc si改为add si, 2。

3. 重复的标签定义

next标签在arraysum和printnum过程中重复定义,在small代码段模型下,同一代码段的标签必须唯一,这会导致汇编错误或执行流程混乱。
修复:将printnum中的next标签重命名为printnum_next(或其他唯一名称)。

修复后的完整代码

.model  small
.stack   100h
.data
A dw 12, 5, 8, -1, 4
B dw -2, 9, 0, 18, 3
C dw 5 dup (?)
N dw 5
.code
mov ax,@data
mov ds,ax
push offset A
push offset B
push offset C
push N
call arraysum
push offset A
push N
call printarray
mov ah, 2
mov dl, 10   
int 21h
push offset B
push N
call printarray
mov ah, 2
mov dl, 10   
int 21h
push offset C
push N
call printarray
mov ah, 2
mov dl, 10   
int 21h
.exit
sum proc near
push bp
mov bp,sp
mov ax,[bp+4]   
add ax,[bp+6]
pop bp
ret 4
sum endp
arraysum proc near
push bp
mov bp, sp
mov cx,[bp+4]
mov di, [bp + 10]
mov si, [bp + 8]
mov bx,[bp+6]
next:
push word ptr [di]
push word ptr [si]
call sum
; 移除多余的pop操作
mov [bx], ax
add si, 2  
add di, 2  
add bx, 2
dec cx
jnz next
pop bp
ret 8
arraysum endp

printnum proc near
    push bp
    mov bp, sp
    mov ax, [bp + 4] 
    mov bx, 10
    mov cx, 0
    
    cmp ax, 0 
    jge printnum_next ; 重命名标签避免冲突
    neg ax
    
printnum_next1:   
    mov dx, 0
    div bx
    add dx, 30h
    push dx
    inc cx
    cmp ax, 0
    jne printnum_next1
    
    mov ax,[bp+4]
    cmp ax, 0
    jge sof
    push '-'
    inc cx
    
sof:
    cmp cx, 0
    jz ext
    pop dx
    mov ah, 2
    int 21h
    dec cx
    jmp sof
    
ext:
    ; 打印空格分隔数字,提升可读性
    mov dl, ' '
    mov ah, 2
    int 21h
    pop bp
    ret 2   
printnum endp
printarray proc near
    push bp
    mov bp, sp
    mov cx, [bp + 4]  
    mov si, [bp + 6]  
    
print_loop:
    push word ptr [si]  
    call printnum       
    add sp, 2          
    add si, 2 ; 修改为双字节步长
    dec cx            
    jnz print_loop     

    pop bp
    ret 4
printarray endp

end

额外说明:修复后的代码在printnum末尾添加了空格分隔符,让数组元素的打印结果更清晰易读。

内容的提问来源于stack exchange,提问作者P.I.S

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 02:33:10