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

如何在TASM中逐字符输出字符串?DOSBox程序问题求助

TASM字符串每行单字符输出问题修复

你的代码存在两个核心问题,对应修复方案如下:

问题1:字符串长度获取错误

INT 21h的0Ah号输入功能要求缓冲区必须遵循固定格式:

  • 第1字节:允许输入的最大字符数(不含回车)
  • 第2字节:系统自动填充的实际输入字符数(不含回车)
  • 第3字节开始:存储输入的字符

你当前的缓冲区定义不符合这个格式,导致无法正确获取实际输入长度。

问题2:单字符输出实现错误

你用09h功能输出,该功能会从DX指向的位置一直输出到$结束,所以每次会输出从当前位置到末尾的所有字符,无法实现单字符输出。应该改用02h功能逐个输出字符。


修改后的完整代码

.model small
.data
    message db 'String: $'
    ; 0Ah功能缓冲区:10=最大输入长度,?=实际长度占位,10个字符空间
    string db 10, ?, 10 dup(' ')  
.stack 256h
.code
main:
    mov ax, @data
    mov ds, ax

    ; 输出提示信息
    lea dx, message
    mov ah, 09h
    int 21h

    ; 输入字符串(使用0Ah功能)
    lea dx, string
    mov ah, 0Ah
    int 21h

    ; 换行
    mov dl, 10
    mov ah, 02h
    int 21h
    mov dl, 13
    mov ah, 02h
    int 21h
    
    ; 设置循环参数:实际输入长度存于string+1位置
    mov cl, string+1
    xor ch, ch  ; CX = CL,循环次数为实际输入字符数
    mov si, 0   ; 字符索引从0开始

output:
    ; 取单个字符:string[si+2]是第si个输入字符(跳过前两个长度字节)
    mov dl, string[si+2]
    mov ah, 02h ; 02h功能:输出DL中的单个字符
    int 21h

    ; 换行
    mov dl, 10
    mov ah, 02h
    int 21h
    mov dl, 13
    mov ah, 02h
    int 21h
    
    inc si
    loop output

    ; 程序退出
    mov ah,4ch
    int 21h
end main

关键改动说明

  1. 缓冲区修正:重新定义string为符合0Ah功能的格式,确保能正确获取实际输入长度。
  2. 循环次数设置:从string+1读取系统填充的实际输入字符数,作为循环次数,避免输出空行。
  3. 单字符输出:使用INT 21h的02h功能,每次仅输出DL中的单个字符,实现每行一个字符的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 21:05:23