【发布时间】:2018-01-08 15:55:06
【问题描述】:
我有以下代码。
.data
msg db 10, 13, "this is a string $"
bufferSize db 21 ; 20 char + RETURN
inputLength db 0 ; number of read characters
buffer db 21 DUP(0) ; actual buffer
.code
main proc
mov ax, @data
mov ds, ax
lea dx, msg
mov ah, 09h ;output
int 21h
mov dx, offset bufferSize ; load our pointer to the beginning of the structure
mov ah, 0Ah ; GetLine function
int 21h
xor dx, dx
lea dx, buffer
mov ah, 06h ;output
int 21h
mov ah,0
int 21h
endp
end main
代码应提示输入名称,然后显示它。提示正确,但不显示结果。
【问题讨论】:
-
int 21h/ah=06h读取单个字符。也许您打算使用int 21h/ah=0ah。此外,int 21h/ah=09h会打印 strings,因此您不能像在程序结束时尝试那样使用它来打印单个字符。 -
是的,我使用了 0ah 并且它有效,但是在输入之后它在哪里存储输入?如果我输入不能用 21h/09h 打印,你是什么意思?我可以用什么来打印它?
-
“但是在输入之后它会将输入存储在哪里” 你在哪里told the interrupt function to store it。 “如果我接受输入是什么意思,我不能用 21h/09h 打印它” 看起来你正试图通过将字符放在
dl中然后使用 @987654327 来打印单个字符@。这是行不通的,因为int 21h/ah=09h打印$终止的字符串。查找int 21h函数的参考资料,了解您可以使用哪些函数。 -
我更新了它,如果可以的话,告诉我问题出在哪里:)
-
你在 .data 中保留空间,但给 DOS
.code:BufferSize地址,如果你有 EXE 文件,这是不同的段(cs==ds仅在 COM 文件中)。在你的第一个输出正确之后,你的缓冲区也是正确的ds,所以没有必要做mov ax,csmov ds,ax,这是设置ds指向.code段。