Emu8086电影售票系统汇编代码:输入数量后乱码问题求助
解决Emu8086电影售票系统输入数量后的乱码问题
针对你遇到的输入购票数量后出现乱码、直到支付环节才恢复的问题,下面是8086汇编中这类问题的常见诱因和具体修复方案:
1. 输入缓冲区残留未处理字符
用int 21h做输入(比如AH=01h单字符读取、AH=0Ah多字符读取)后,回车符0Dh或其他残留字符会留在输入缓冲区里,后续调用输出功能(AH=09h)时会把这些字符直接输出,导致乱码。
- 修复代码:输入完成后手动清空缓冲区:
如果用的是AH=01h读数量,读完数字后直接调用这个子程序清除回车即可。; 清空输入缓冲区,直到读取到回车符 clear_input_buf: mov ah, 01h int 21h cmp al, 0Dh jne clear_input_buf
2. 输出字符串缺少$结束符
Emu8086中用int 21h AH=09h输出字符串时,要求字符串必须以$结尾。如果计算税前价格后生成的字符串没加这个结束符,程序会一直输出内存中的垃圾数据,直到随机碰到一个$才停止,这就会出现乱码。
- 修复:生成价格字符串后,务必在末尾加上
$。比如:; 假设buffer是存储价格字符串的内存地址,bx是字符串长度 mov [buffer + bx], '$'
3. 寄存器未正确保存/恢复
输入数量时用到的寄存器(比如AX、BX、CX),如果在后续计算价格或输出时被意外覆盖,会导致输出的字符串地址或内容出错,显示乱码。
- 修复:在调用输入/输出功能前,把关键寄存器压栈保存,用完再弹栈恢复:
push ax push bx ; 这里执行输入数量或者价格计算的逻辑 pop bx pop ax
4. 数值转字符串逻辑错误
把购票数量转换成ASCII字符串显示税前价格时,如果没给数字加上30h的偏移(数字0-9对应ASCII的'0'-'9'需要加30h),或者位数计算错误,会生成非ASCII字符,表现为乱码。
- 修复示例(把AX中的数值转成字符串存到buffer):
mov si, offset buffer + 5 ; 从缓冲区末尾开始存 mov bx, 10 mov [si], '$' ; 先加结束符 dec si num_to_ascii: xor dx, dx div bx ; AX除以10,余数在DX add dl, 30h ; 余数转成ASCII字符 mov [si], dl dec si cmp ax, 0 ; 商为0时停止 jne num_to_ascii
5. 光标位置未正确设置
输入数量后如果没调整光标位置,输出的价格可能会覆盖之前的输入内容,或者和显存中残留的垃圾数据混在一起,导致乱码。
- 修复:用
int 10h把光标移到下一行开头再输出:; 设置光标到当前行的下一行开头 mov ah, 02h mov bh, 0 ; 第0页 mov dl, 0 ; 列号0 inc dh ; 行号+1 int 10h
调试技巧
- 用Emu8086的单步调试功能,在输入数量后、输出税前价格前暂停,检查相关寄存器的值和内存中字符串的内容,确认是否符合预期。
- 打开内存查看窗口,查看输出字符串所在的内存区域,确认是否有正确的
$结束符,以及字符串内容是否是合法的ASCII字符。
内容的提问来源于stack exchange,提问作者D Elisha
相关产品推荐
相关产品推荐

