汇编语言COM程序输出文本覆盖及堆叠问题求助
汇编语言文本输出问题解答
问题1:汇编语言输出文本时为何会出现文本堆叠现象?
文本堆叠本质是光标位置异常导致的内容覆盖,核心原因有两个:
- DOS的
int 21h09h功能调用,是从DX指向的地址开始输出,直到遇到$终止符才停止。如果字符串里混入回车符(0Dh),这个字符会让光标跳回当前行的开头,后续输出的内容就会覆盖掉前面的文本,看起来像是堆叠。 - 用
int 21h0Ah功能读取用户输入时,输入缓冲区结构是:第一个字节是最大允许长度,第二个字节是实际输入字符数,从第三个字节开始是用户输入的字符,结尾是回车符(0Dh)而非$。如果直接跳过前两个字节输出内容,这个回车符就会被输出,触发光标回退,造成堆叠。
问题2:COM程序输出位置异常的修复
你的代码核心问题是输入字符串结尾保留了回车符(0Dh),输出名字时这个回车符让光标跳回行首,导致名字覆盖了"Hello"的位置;同时输出姓氏和名字之间缺少空格,格式不符合要求。
修复步骤:
- 读取用户输入后,把输入结尾的回车符替换成
$,避免输出时触发光标回退。 - 在输出姓氏和名字之间添加空格,保证格式正确。
修改后的完整代码:
org 100h jmp start first_name db 255, 0, 255 dup("$") ; 第二个字节初始化0更规范 last_name db 255, 0, 255 dup("$") msg db "Enter first name: $" msg2 db 10,13,"Enter last name: $" hello db 10,13, "Hello, $" space db " $" ; 定义空格变量 start: ; 提示输入名字 mov ah, 09h mov dx, offset msg int 21h ; 读取名字 mov ah, 0Ah lea dx, first_name int 21h ; 替换名字结尾的回车符为$ mov cl, first_name+1 ; 获取实际输入长度 mov ch, 0 lea bx, first_name+2 ; 指向输入的第一个字符 add bx, cx ; 指向回车符的位置 mov byte ptr [bx], '$' ; 提示输入姓氏 mov ah, 09h mov dx, offset msg2 int 21h ; 读取姓氏 mov ah, 0Ah lea dx, last_name int 21h ; 替换姓氏结尾的回车符为$ mov cl, last_name+1 mov ch, 0 lea bx, last_name+2 add bx, cx mov byte ptr [bx], '$' ; 输出Hello前缀 mov ah, 09h mov dx, offset hello int 21h ; 输出姓氏 mov ah, 09h lea dx, last_name+2 int 21h ; 输出空格 mov ah, 09h mov dx, offset space int 21h ; 输出名字 mov ah, 09h lea dx, first_name+2 int 21h ; 退出程序 mov ax, 4C00h int 21h
关键修改点说明:
- 读取输入后,通过实际输入长度定位到回车符位置,将其替换为
$,确保09h调用输出时不会触发光标回退。 - 添加
space变量,在姓氏和名字之间输出空格,符合需求格式。 - 初始化输入缓冲区第二个字节为0,是更清晰规范的写法(0Ah调用会自动填充实际长度,初始值不影响功能,但可读性更强)。
内容的提问来源于stack exchange,提问作者Артем Лебідь
相关产品推荐
相关产品推荐

