.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
系统预计会一一请求用户输入 3 行(成功)。但是,输出不正确(没有垃圾行,只是字符串混乱)
(否则这个问题将永远悬而未决,未来的读者将不得不阅读数十条评论才能找到答案)
当使用 MS-DOS 中断 21h、函数 09h 打印字符串时,该字符串需要以美元符号 ('$') 结尾。
当使用 MS-DOS 中断 21h、函数 0ah 读取字符串时,字符串以 回车符 结束。 (ASCII 控制字符名称 'CR',ASCII 代码十进制为 13,十六进制为 0Dh。)
打印 CR 字符时,会导致光标移动到当前行的开头,但不会移动到下一行。
因此打印之前读取到的字符串后,必须打印一个换行(ASCII控制字符名'LF',ASCII码十进制为10,十六进制为0Ah)移动到下一行,否则打印下一个字符串您打印的内容将与上一个打印在同一行。