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
相关产品推荐
相关产品推荐

