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

汇编语言COM程序输出文本覆盖及堆叠问题求助

汇编语言文本输出问题解答

问题1:汇编语言输出文本时为何会出现文本堆叠现象?

文本堆叠本质是光标位置异常导致的内容覆盖,核心原因有两个:

  1. DOS的int 21h 09h功能调用,是从DX指向的地址开始输出,直到遇到$终止符才停止。如果字符串里混入回车符(0Dh),这个字符会让光标跳回当前行的开头,后续输出的内容就会覆盖掉前面的文本,看起来像是堆叠。
  2. 用int 21h 0Ah功能读取用户输入时,输入缓冲区结构是:第一个字节是最大允许长度,第二个字节是实际输入字符数,从第三个字节开始是用户输入的字符,结尾是回车符(0Dh)而非$。如果直接跳过前两个字节输出内容,这个回车符就会被输出,触发光标回退,造成堆叠。

问题2:COM程序输出位置异常的修复

你的代码核心问题是输入字符串结尾保留了回车符(0Dh),输出名字时这个回车符让光标跳回行首,导致名字覆盖了"Hello"的位置;同时输出姓氏和名字之间缺少空格,格式不符合要求。

修复步骤:

  1. 读取用户输入后,把输入结尾的回车符替换成$,避免输出时触发光标回退。
  2. 在输出姓氏和名字之间添加空格,保证格式正确。

修改后的完整代码:

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,提问作者Артем Лебідь

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 01:13:59