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
问题原因
- INT 21h 0Ah功能的缓冲区特性:使用0Ah功能读取字符串时,用户按回车完成输入后,程序会在输入字符的末尾写入回车符(0Dh),而非字符串结束符
$。 - 输出混乱的直接原因: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
相关产品推荐
相关产品推荐

