assembly 在汇编语言中输出文本时,为什么文本一个在另一个的上面流动?

5uzkadbs  于 2023-02-12  发布在  其他
关注(0)|答案(1)|浏览(102)

任务:编写一个com-program,首先询问你的名字,输入名字后,询问姓氏,然后输出:您好,输入了姓输入了名。
但是当我输出名字时,它出现在消息的开头(Hello)。可能是什么原因?如果只显示姓氏,一切都很好
[一个月一次](一个月一次)

org 100h
jmp start

first_name db 255,255,255 dup("$")
last_name db 255,255,255 dup("$")
msg db "Enter first name: $"
msg2 db 10,13,"Enter last name: $"
hello db 10,13, "Hello, $"

start:
; display "Enter first name" message
mov ah, 09h
mov dx, offset msg
int 21h

    ; read first name from user
    mov ah, 0Ah
    lea dx, first_name
    int 21h
    
    ; display "Enter last name" message
    mov ah, 09h
    mov dx, offset msg2
    int 21h
    
    ; read last name from user
    mov ah, 0Ah
    lea dx, last_name
    int 21h
    
    ; display "Hello" message
    mov ah, 09h
    mov dx, offset hello
    int 21h
    
    ; display last name
    mov ah, 09h
    lea dx, last_name
    add dx, 2h
    int 21h
    
    ; display first name
    mov ah, 09h
    lea dx, first_name
    add dx, 2h
    int 21h
    
    ; exit program
    mov ax, 4C00h
    int 21h

我是汇编程序新手,所以我在YouTube上看了视频,读了文章,但我什么都不懂

fdbelqdn

fdbelqdn1#

first_name db 255,255,255 dup("$")

看到一个缓冲区被预先加载了**$**字符总是一个不好的信号!这对于那些想在程序中偷工减料的人来说是一个很好的信号。
当使用DOS.BufferedInput函数0Ah时,在输入名称后,您必须按Enter键。此键的ASCII代码将添加到缓冲区中。例如,在输入您的名称后,缓冲区将如下所示:

255, 5, A, p, t, e, m, 13, $, $, $, $, ...
        ====================

所以你以后在DOS下打印出来的是什么,PrintString函数09 h是我给你画了下划线的部分,它包含了一个回车符(13),把光标带回到屏幕的左边,逻辑上它会被下一个输出覆盖。
了解How buffered input works中的DOS.BufferedInput函数0Ah。
溶液
因为您在屏幕上有两个名字,所以用空格字符替换姓氏末尾的13是有意义的,这样姓氏和名字之间就有了一些分隔(按此顺序):

; display last name
lea  si, last_name
inc  si
mov  bl, [si]            ; This is 5 if you inputted last name "Aptem"
mov  bh, 0
inc  si
mov  byte [si+bx], " "   ; Replace 13 by 32
mov  dx, si
mov  ah, 09h
int  21h

相关问题