8086汇编编程中接受字符串和显示字符串

问题描述 投票:0回答:1
.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 行(成功)。但是,输出不正确(没有垃圾行,只是字符串混乱)

assembly x86-16 dos tasm
1个回答
0
投票

总结评论中的讨论:

(否则这个问题将永远悬而未决,未来的读者将不得不阅读数十条评论才能找到答案)

当使用 MS-DOS 中断 21h、函数 09h 打印字符串时,该字符串需要以美元符号 ('$') 结尾。

当使用 MS-DOS 中断 21h、函数 0ah 读取字符串时,字符串以 回车符 结束。 (ASCII 控制字符名称 'CR',ASCII 代码十进制为 13,十六进制为 0Dh。)

打印 CR 字符时,会导致光标移动到当前行的开头,但不会移动到下一行。

因此打印之前读取到的字符串后,必须打印一个换行(ASCII控制字符名'LF',ASCII码十进制为10,十六进制为0Ah)移动到下一行,否则打印下一个字符串您打印的内容将与上一个打印在同一行。

© www.soinside.com 2019 - 2024. All rights reserved.