汇编程序无法输出筛选后的out_str数组,请求技术协助
问题分析与修复方案
核心问题清单
- 缺失数据段定义:代码中引用了
d1数据段但未声明,导致ds无法正确指向数据区域,变量访问全部错误。 - 未定义关键变量:
in_str(DOS输入缓冲区)、out_str(输出缓冲区)、mess1/mess2提示字符串均未声明。 out_str缺少字符串结束符:DOS中断int 21h ah=9要求输出字符串必须以$结尾,否则无法识别输出边界,导致无内容输出。- 筛选逻辑不符合预期:当前条件判断的区间逻辑模糊,若目标是筛选数字字符,现有判断逻辑完全错误。
修复后的完整代码
; 数据段定义 d1 segment para public 'data' mess1 db '请输入字符数组(最多22个字符):$' mess2 db 0dh,0ah,'筛选结果:$' ; DOS 0Ah号输入缓冲区格式:最大长度 | 实际输入长度 | 输入内容存储区 in_str db 23, 0, 23 dup(0) ; 输出缓冲区,预留空间并添加结束符 out_str db 23 dup(0), '$' d1 ends st1 segment stack para public 'stack' dw 100h dup(?) st1 ends c1 segment para public 'code' assume cs:c1, ds:d1, ss:st1 start: mov ax, d1 mov ds,ax ; 输出输入提示 mov ah,9 mov dx, offset mess1 int 21h ; 读取键盘输入(DOS 0Ah功能) mov ah,10 mov dx, offset in_str int 21h mov si, offset in_str+2 ; 指向输入内容起始位置 mov di, offset out_str ; 指向输出缓冲区起始位置 mov cl, in_str+1 ; 获取实际输入字符数 xor ch, ch one: mov al,[si] ; 跳过回车符(输入结束的标志) cmp al,0Dh JE next ; 筛选数字字符(ASCII 30h-39h,对应0-9) cmp al,30h JB next cmp al,39h JA next ; 符合条件则存入输出缓冲区 next1: mov [di],al inc di next: inc si loop one ; 输出结果提示 mov ah,9 mov dx, offset mess2 int 21h ; 输出筛选后的字符串 mov ah,9 mov dx, offset out_str int 21h ; 程序退出 mov ax, 4c00h int 21h c1 ends end start
关键修复说明
- 补充数据段与变量:新增
d1数据段,严格按照DOS输入功能格式定义in_str,同时声明所有提示字符串和输出缓冲区。 - 添加字符串结束符:在
out_str末尾添加$,确保DOS输出中断能正确识别输出边界。 - 修正筛选逻辑:调整判断条件为筛选数字字符(ASCII 30h到39h),若你需要筛选其他区间,直接替换
cmp指令中的数值即可。 - 完善栈段:补充栈段的实际空间定义,避免栈溢出风险。
内容的提问来源于stack exchange,提问作者Eekit Eekit
相关产品推荐
相关产品推荐

