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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 13:51:15