任务:编写一个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上看了视频,读了文章,但我什么都不懂
1条答案
按热度按时间fdbelqdn1#
看到一个缓冲区被预先加载了**$**字符总是一个不好的信号!这对于那些想在程序中偷工减料的人来说是一个很好的信号。
当使用DOS.BufferedInput函数0Ah时,在输入名称后,您必须按Enter键。此键的ASCII代码将添加到缓冲区中。例如,在输入您的名称后,缓冲区将如下所示:
所以你以后在DOS下打印出来的是什么,PrintString函数09 h是我给你画了下划线的部分,它包含了一个回车符(13),把光标带回到屏幕的左边,逻辑上它会被下一个输出覆盖。
了解How buffered input works中的DOS.BufferedInput函数0Ah。
溶液
因为您在屏幕上有两个名字,所以用空格字符替换姓氏末尾的13是有意义的,这样姓氏和名字之间就有了一些分隔(按此顺序):