使用emu8086编写的8086汇编输入打印字符串程序无法输出
问题分析与解决方案
你的代码无法输出字符串的核心原因是没有在输入完成后手动为字符串添加$结束符——虽然初始化时var1被填充了$,但如果输入字符数量刚好占满100个字节,会覆盖掉最后的$,导致int 21h的9号输出功能无法识别字符串结尾;另外,使用mov dx,10调用输出换行的写法不规范,应该直接操作dl寄存器(int 21h的2号功能仅读取dl的值)。
修正后的代码如下:
.model small .stack 100h .data var1 db 100 dup(?) ; 改为未初始化,避免依赖默认的$ .code main proc mov ax,@data mov ds,ax mov si,offset var1 l1: mov ah,1 int 21h cmp al,13 ; 判断是否按下回车 je programend mov [si],al inc si jmp l1 programend: mov [si], '$' ; 手动添加字符串结束符,确保输出功能能识别结尾 mov dl,10 ; 输出换行符(ASCII 10) mov ah,2 int 21h mov dl,13 ; 输出回车符(ASCII 13),让光标回到行首 mov ah,2 int 21h mov dx, offset var1 mov ah,9 ; 调用字符串输出功能 int 21h mov ah,1 ; 等待用户按任意键,避免程序直接退出导致看不到输出 int 21h mov ah,4ch int 21h main endp end main
修改说明:
- 添加手动结束符:在输入完成后执行
mov [si], '$',无论输入多少字符,都能保证字符串以$结尾,确保int 21h的9号功能正确输出。 - 规范换行输出:将
mov dx,10改为mov dl,10,因为int 21h的2号功能仅使用dl寄存器存储要输出的字符。 - 添加回车输出:增加
mov dl,13的输出,让光标移动到下一行的开头,输出的字符串位置更符合预期。 - 添加等待输入:在程序退出前执行
mov ah,1的功能调用,让用户按任意键后再退出,避免窗口直接关闭导致看不到输出结果。 - 优化变量初始化:将
var1的初始化改为dup(?),因为我们会手动添加结束符,不需要依赖默认的$填充,更合理。
内容的提问来源于stack exchange,提问作者Syed Aizaz
相关产品推荐
相关产品推荐

