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

Emu8086电影售票系统汇编代码:输入数量后乱码问题求助

解决Emu8086电影售票系统输入数量后的乱码问题

针对你遇到的输入购票数量后出现乱码、直到支付环节才恢复的问题,下面是8086汇编中这类问题的常见诱因和具体修复方案:

1. 输入缓冲区残留未处理字符

用int 21h做输入(比如AH=01h单字符读取、AH=0Ah多字符读取)后,回车符0Dh或其他残留字符会留在输入缓冲区里,后续调用输出功能(AH=09h)时会把这些字符直接输出,导致乱码。

  • 修复代码:输入完成后手动清空缓冲区:
    ; 清空输入缓冲区,直到读取到回车符
    clear_input_buf:
        mov ah, 01h
        int 21h
        cmp al, 0Dh
        jne clear_input_buf
    
    如果用的是AH=01h读数量,读完数字后直接调用这个子程序清除回车即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 17:52:34