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

8086汇编编程:字符串输入正常但显示混乱的问题咨询

问题分析与解决

问题背景

以下是一段8086汇编程序,功能是请求用户输入3行收货地址并输出,输入功能正常,但输出时字符串显示混乱:

.model small
.stack 100h
.data
    address_req1    DB  10, 13, "        Enter Shipping Address (Line 1): $"
    address_req2    DB  10, 13, "                               (Line 2): $"
    address_req3    DB  10, 13, "                               (Line 3): $"
    add_input1      DB  25, 0, 23 dup ('$')
    add_input2      DB  25, 0, 23 dup ('$')
    add_input3      DB  25, 0, 23 dup ('$')

.code
ACCEPT_STRING PROC
    mov ah, 09h             ;display request address1
    lea dx, address_req1
    int 21h
    
    mov ah, 0ah             ;accept address1
    lea dx, add_input1
    int 21h
    
    mov ah, 09h             ;display request address2
    lea dx, address_req2
    int 21h
    
    mov ah, 0ah             ;accept address2
    lea dx, add_input2
    int 21h

    mov ah, 09h             ;display request address3
    lea dx, address_req3
    int 21h
    
    mov ah, 0ah             ;accept address3
    lea dx, add_input3
    int 21h

    ret
ACCEPT_STRING ENDP

PRINT_STRING PROC
    mov ah, 09h
    lea dx, add_input1 + 2
    int 21h

    mov ah, 09h
    lea dx, add_input2 + 2
    int 21h

    mov ah, 09h
    lea dx, add_input3 + 2
    int 21h

    ret
PRINT_STRING ENDP

MAIN    PROC    FAR
    mov ax, @data
    mov ds, ax

    call    ACCEPT_STRING
    call    PRINT_STRING

    mov ax, 4c00h
    int 21h

MAIN    ENDP
END     MAIN

问题原因

  1. INT 21h 0Ah功能的缓冲区特性:使用0Ah功能读取字符串时,用户按回车完成输入后,程序会在输入字符的末尾写入回车符(0Dh),而非字符串结束符$。
  2. 输出混乱的直接原因:PRINT_STRING中用INT 21h 09h功能输出字符串时,会持续输出直到遇到$为止。这意味着输入的字符、回车符(0Dh),以及缓冲区中后续的$之前的内容都会被输出。回车符会让光标跳回当前行开头,导致后续输出的内容覆盖前面的字符串,最终显示混乱。

解决方法

方法1:替换回车符为结束符$

每次读取完字符串后,定位到输入字符的末尾位置,将回车符替换成$,确保09h功能只输出用户输入的有效内容。

修改后的ACCEPT_STRING PROC如下:

ACCEPT_STRING PROC
    mov ah, 09h             ;display request address1
    lea dx, address_req1
    int 21h
    
    mov ah, 0ah             ;accept address1
    lea dx, add_input1
    int 21h
    ; 处理add_input1:替换回车符为$
    mov cl, add_input1 + 1  ; 获取实际输入长度
    mov ch, 0
    lea bx, add_input1 + 2
    add bx, cx              ; 跳到输入字符的末尾(回车符位置)
    mov byte ptr [bx], '$'  ; 替换为$
    
    mov ah, 09h             ;display request address2
    lea dx, address_req2
    int 21h
    
    mov ah, 0ah             ;accept address2
    lea dx, add_input2
    int 21h
    ; 处理add_input2
    mov cl, add_input2 + 1
    mov ch, 0
    lea bx, add_input2 + 2
    add bx, cx
    mov byte ptr [bx], '$'

    mov ah, 09h             ;display request address3
    lea dx, address_req3
    int 21h
    
    mov ah, 0ah             ;accept address3
    lea dx, add_input3
    int 21h
    ; 处理add_input3
    mov cl, add_input3 + 1
    mov ch, 0
    lea bx, add_input3 + 2
    add bx, cx
    mov byte ptr [bx], '$'

    ret
ACCEPT_STRING ENDP

方法2:输出时添加换行符

如果希望每行输入的内容单独显示在新行,可在输出每个字符串前先输出换行(换行符10+回车符13),避免内容覆盖。

修改后的PRINT_STRING PROC如下:

PRINT_STRING PROC
    ; 输出换行,显示第一行
    mov ah, 09h
    lea dx, newline
    int 21h
    lea dx, add_input1 + 2
    int 21h

    ; 输出换行,显示第二行
    mov ah, 09h
    lea dx, newline
    int 21h
    lea dx, add_input2 + 2
    int 21h

    ; 输出换行,显示第三行
    mov ah, 09h
    lea dx, newline
    int 21h
    lea dx, add_input3 + 2
    int 21h

    ret
PRINT_STRING ENDP

同时需要在.data段中添加换行符定义:

newline DB 10, 13, '$'

建议

优先使用方法1,既能保证输出内容的准确性,又能避免不必要的换行干扰;如果需要格式化输出每行内容,可结合两种方法。


内容的提问来源于stack exchange,提问作者Dylan Khor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 00:00:13