0

我在打印从键盘读取的字符串时遇到问题,如果字符串是最大长度,那么它可以工作,但是如果我只输入 3 个字符,例如我得到一个空白的黑色空间,这是代码:

assume cs:code,ds:data

data segment
    sir db 12 dup (?),'$'
    mesaj db "Who`s your daddy?",13,10,"$"
data ends

code segment
start:
    mov ax,data
    mov ds,ax
    mov dx,offset mesaj
    mov ah,09h
    int 21h
    mov bx,offset sir
    mov sir[0],11
    mov dx,bx
    mov ah,0ah
    int 21h
    mov dx,offset sir
    mov ah,09h
    int 21h
    mov ah,01h
    int 21h
    mov ax,4c00h
    int 21h
code ends

end start
4

1 回答 1

0

如果您更改您的sir db 12 dup (?), '$'to sir db 12 dup('$'),'$',并且您的mov dx, offset sirtomov dx, offset sir + 2就像其他人在评论中建议的那样,您的代码应该可以工作。

但是,如果您想清楚地看到结果,则需要打印一些换行符。

这是因为0ah例程(字符串输入):

  1. 0dh将您的输入回显到终端,包括按 Enter 时它拾取的回车符 ( ),但不包括0ah将光标移动到下一行的换行符 ( )

  2. 将您的所有输入(包括回车)放在指定的内存位置,但同样没有换行。

这意味着在输入例程运行后,您的光标立即位于您输入的行的开头,该行仍然包含您的回显输入。因此,在您执行任何其他操作之前,打印一个换行符以使其进入下一行。

接下来,当你打印出字符串时,最后的回车被拾起,光标返回到行首,但同样没有换行。之后写入的任何内容(由您的程序或系统上的任何其他程序)很可能会覆盖您打印的内容。因此,再次打印一个换行符,使其首先进入下一行。

打印换行应该很简单:

data segment
....
    lf db 10, '$'
....

code segment
....
    mov dx, offset lf
    mov ah, 9
    int 21h
....

    mov dx, offset lf
    mov ah, 9
    int 21h
....
于 2014-11-08T01:12:00.080 回答