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

x86汇编程序打印用户输入时出现随机乱码该如何解决

你代码里的打印逻辑有两个核心错误:

核心错误点

  • 你调用int 21h的09h子功能打印字符串时,要求待打印的内容必须以$作为终止标记,且要指向字符串内容的首地址。你直接把buffer的首地址传给dx,首先打印的是buffer的前两个控制字节:第一个字节值为10(对应ASCII的换行符),第二个字节是实际输入的字符数(纯数值,不是可打印字符),这部分本来就不属于用户输入的内容。
  • DOS的0Ah键盘输入功能的缓冲区结构是固定的:第一个字节存最大允许输入字符数,第二个字节存实际输入的字符数,从第三个字节(也就是buffer+2)才开始存用户实际输入的内容,且输入结束后不会自动在末尾加$标记。你直接从buffer首地址开始打印,且没有手动加结束符,程序会持续读取后面的内存数据直到碰巧遇到$,这就是大量乱码的来源。

修正后的参考代码

.model small
.stack 100h

.data
    info db "Enter a string $"
    buffer db 10, ?, 10 dup(" ")
.code

start:
    MOV dx, @data
    MOV ds, dx

    mov ah, 09h ; 打印提示信息
    lea dx, info
    int 21h

    mov ah, 0Ah ; 读取用户输入
    lea dx, buffer
    int 21h

    ; 手动在输入内容末尾加$结束符
    xor bx, bx
    mov bl, buffer[1] ; 取实际输入的字符数
    mov buffer[bx+2], '$' ; 输入内容的最后一位后面加$

    mov ah, 09h ; 打印输入内容,从buffer+2开始
    lea dx, buffer+2
    int 21h

    mov ah, 4ch
    mov al, 0
    int 21h

end start

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 04:36:04