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
相关产品推荐
相关产品推荐

