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 10Q1、R1需定义为字节型变量:Q1 DB ?,R1 DB ?
内容的提问来源于stack exchange,提问作者zuo hao
相关产品推荐
相关产品推荐

