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

MASM x86汇编程序打印收据时汉堡后出现随机符号问题求助

问题排查与修复:MASM x86汇编打印收据出现随机符号

问题现象

运行MASM x86汇编程序打印收据时,所有汉堡名称后出现随机符号,需实现仅打印数量>0的汉堡,下一行显示单价与订购数量的需求。

错误根源

1. 过程缺少返回指令(ret)

所有display_burger1到display_burger4过程末尾都没有ret指令,执行完过程代码后,CPU会继续执行内存中后续的随机指令,直接导致输出乱码。

2. DOS中断使用错误

打印单个字符(数量的十位、个位)时错误使用了AH=09H中断:该中断用于打印以$结尾的字符串,而非单个字符。正确打印单个字符应使用AH=02H中断(通过DL传递字符ASCII码)。

3. 字符串未正确终止

若burger_1_name、next_line、space、burger_price等字符串未以$结尾,AH=09H中断会持续打印内存中的数据,直到遇到第一个$,这也是随机符号出现的常见原因。

修复后的代码示例

scan_burger PROC
    
    CMP burger_quantity[0], 0
    JLE detect_burger_quantity_A
    
    CALL display_burger1

detect_burger_quantity_A:
    CMP burger_quantity[1], 0
    JLE detect_burger_quantity_B
    
    CALL display_burger2
    
detect_burger_quantity_B:
    CMP burger_quantity[2], 0
    JLE detect_burger_quantity_C
    
    CALL display_burger3
    
detect_burger_quantity_C:
    CMP burger_quantity[3], 0
    JLE return_scan_burger
    
    CALL display_burger4

return_scan_burger:
    ret
    
scan_burger ENDP

display_burger1 PROC
    
    MOV AH, 09H
    LEA DX, burger_1_name  ; 确保该字符串以$结尾
    INT 21H
    
    MOV AH, 09H
    LEA DX, next_line      ; 确保该字符串以$结尾(如定义为next_line DB 0AH,0DH,'$')
    INT 21H
    
    XOR AX, AX
    
    MOV AL, burger_quantity[0]
    DIV ten
    MOV Q1, AL
    MOV R1, AH
    
    ADD Q1, '0'
    ADD R1, '0'
    
    ; 用AH=02H打印单个字符
    MOV AH, 02H
    MOV DL, Q1
    INT 21H
    
    MOV AH, 02H
    MOV DL, R1
    INT 21H
    
    MOV AH, 09H
    LEA DX, space          ; 确保该字符串以$结尾
    INT 21H
    
    MOV AH, 09H
    LEA DX, burger_price[0] ; 确保该字符串以$结尾
    INT 21H
    
    ret ; 新增返回指令
display_burger1 ENDP

display_burger2 PROC

    MOV AH, 09H
    LEA DX, burger_2_name
    INT 21H
    
    MOV AH, 09H
    LEA DX, next_line
    INT 21H
    
    XOR AX, AX
    
    MOV AL, burger_quantity[1]
    DIV ten
    MOV Q1, AL
    MOV R1, AH
    
    ADD Q1, '0'
    ADD R1, '0'
    
    MOV AH, 02H
    MOV DL, Q1
    INT 21H
    
    MOV AH, 02H
    MOV DL, R1
    INT 21H
    
    MOV AH, 09H
    LEA DX, space
    INT 21H
    
    MOV AH, 09H
    LEA DX, burger_price[1]
    INT 21H
    
    ret ; 新增返回指令
display_burger2 ENDP

display_burger3 PROC

    MOV AH, 09H
    LEA DX, burger_3_name
    INT 21H
    
    MOV AH, 09H
    LEA DX, next_line
    INT 21H
    
    XOR AX, AX
    
    MOV AL, burger_quantity[2]
    DIV ten
    MOV Q1, AL
    MOV R1, AH
    
    ADD Q1, '0'
    ADD R1, '0'
    
    MOV AH, 02H
    MOV DL, Q1
    INT 21H
    
    MOV AH, 02H
    MOV DL, R1
    INT 21H
    
    MOV AH, 09H
    LEA DX, space
    INT 21H
    
    MOV AH, 09H
    LEA DX, burger_price[2]
    INT 21H

    ret ; 新增返回指令
display_burger3 ENDP

display_burger4 PROC

    MOV AH, 09H
    LEA DX, burger_4_name
    INT 21H
    
    MOV AH, 09H
    LEA DX, next_line
    INT 21H
    
    XOR AX, AX
    
    MOV AL, burger_quantity[3]
    DIV ten
    MOV Q1, AL
    MOV R1, AH
    
    ADD Q1, '0'
    ADD R1, '0'
    
    MOV AH, 02H
    MOV DL, Q1
    INT 21H
    
    MOV AH, 02H
    MOV DL, R1
    INT 21H
    
    MOV AH, 09H
    LEA DX, space
    INT 21H
    
    MOV AH, 09H
    LEA DX, burger_price[3]
    INT 21H
    
    ret ; 新增返回指令
display_burger4 ENDP

额外注意事项

  • 确保所有字符串变量定义时以$结尾,示例:
    burger_1_name DB "Cheeseburger", '$'
    next_line DB 0AH, 0DH, '$' ; 换行符(CR+LF)
    space DB ' ', '$'
    burger_price DB "10.00", '$' ; 假设价格字符串
    
  • ten变量需正确定义为数值10:ten DB 10
  • Q1、R1需定义为字节型变量:Q1 DB ?, R1 DB ?

内容的提问来源于stack exchange,提问作者zuo hao

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 08:36:20