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

汇编语言字符串输入输出问题:输出后出现乱码求助

嘿,我来帮你分析下这个问题!你遇到的重复输出后出现乱码,大概率是字符串没有正确标记结束位置导致的——汇编里不像高级语言会自动帮你处理字符串边界,咱们得自己管好这个事儿。

常见乱码原因&修复步骤

1. 输入时未添加空终止符

很多汇编输入函数(比如DOS环境下的int 21h 0Ah号功能),输入的字符串末尾不会自动添加空终止符(0x00),而多数输出字符串的逻辑是读到0x00才停止。如果你的输入只有换行符,输出时就会一直往后读取内存里的随机数据,直到碰巧碰到一个0x00,这就是乱码的来源。

修复方法:

输入完成后,手动在字符串末尾补上0x00。以DOS中断为例:

; 假设input_buf是输入缓冲区,第一个字节存缓冲区大小,第二个字节存实际输入长度
mov ah, 0Ah
lea dx, input_buf
int 21h

; 获取实际输入长度,定位到字符串最后一位的下一个位置
mov cl, [input_buf+1]
mov ch, 0
lea si, input_buf+2  ; si指向输入字符串的起始位
add si, cx
mov [si], 0          ; 添加空终止符

2. 输入缓冲区设置不合理

如果你的输入缓冲区尺寸太小,或者没有预留足够空间存储输入字符(包括换行符),可能会导致数据溢出,覆盖其他内存区域,后续输出时就会读到被覆盖的乱码数据。

修复方法:

确保缓冲区的第一个字节设置为足够大的数值(比如200,完全能应付作业场景的输入长度),同时缓冲区存储区要预留对应大小的空间:

input_buf db 200    ; 缓冲区最大可存199个字符+1个换行符
          db ?      ; 用于存储实际输入的字符数(不含换行)
          db 200 dup(0) ; 存储输入字符串的区域

3. 输出函数使用错误

有些输出函数(比如DOS的int 21h 09h号功能)要求字符串以$结尾,如果误用了这个函数但字符串末尾没加$,也会导致程序一直读取随机数据直到碰到一个$。

修复方法:

如果用09h功能输出,就在字符串末尾加$;如果想用空终止符控制输出,可以用循环逐个打印字符,直到碰到0x00:

; si指向字符串起始位置
print_loop:
mov al, [si]
cmp al, 0
je print_end        ; 碰到空终止符就停止输出
mov ah, 0Eh         ; 调用BIOS中断打印单个字符
int 10h
inc si
jmp print_loop
print_end:
完整可运行示例(DOS汇编)

给你一个能正常工作的小例子,你可以参考对比自己的代码:

org 100h

section .data
input_buf db 100    ; 最大允许输入99个字符
          db ?
          db 100 dup(0)

section .text
; 读取用户输入
mov ah, 0Ah
lea dx, input_buf
int 21h

; 添加空终止符
mov cl, [input_buf+1]
mov ch, 0
lea si, input_buf+2
add si, cx
mov [si], 0

; 换行(让输出和输入分开两行)
mov ah, 0Eh
mov al, 0Dh
int 10h
mov al, 0Ah
int 10h

; 循环输出字符串
lea si, input_buf+2
print_loop:
mov al, [si]
cmp al, 0
je exit
mov ah, 0Eh
int 10h
inc si
jmp print_loop

exit:
mov ah, 4Ch
int 21h

你可以对照自己的代码,看看是不是在结束符处理、缓冲区设置或者输出逻辑上出了问题。如果还是搞不定,把你的代码贴出来,我再帮你细查~

内容的提问来源于stack exchange,提问作者B.G

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:24:01