汇编语言字符串输入输出问题:输出后出现乱码求助
嘿,我来帮你分析下这个问题!你遇到的重复输出后出现乱码,大概率是字符串没有正确标记结束位置导致的——汇编里不像高级语言会自动帮你处理字符串边界,咱们得自己管好这个事儿。
常见乱码原因&修复步骤
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
相关产品推荐
相关产品推荐

