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

汇编程序无法输出筛选后的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

关键修复说明

  1. 补充数据段与变量:新增d1数据段,严格按照DOS输入功能格式定义in_str,同时声明所有提示字符串和输出缓冲区。
  2. 添加字符串结束符:在out_str末尾添加$,确保DOS输出中断能正确识别输出边界。
  3. 修正筛选逻辑:调整判断条件为筛选数字字符(ASCII 30h到39h),若你需要筛选其他区间,直接替换cmp指令中的数值即可。
  4. 完善栈段:补充栈段的实际空间定义,避免栈溢出风险。

内容的提问来源于stack exchange,提问作者Eekit Eekit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 21:05:25