tasm int 21h ah=02h 输出多于一个字符

Tasm int 21h ah=02h outputs more than one character

我需要获取字符串长度,我的程序成功地做到了,但是它也输出了没有第一个字母的初始字符串。

.model small
.stack 200h

.data
    nuskaitymoBuferis  db 11

.code
pr1:

mov ax, @data
mov ds, ax

mov dx, offset nuskaitymoBuferis
mov ah, 0Ah
int 21h 
mov nuskaitymoBuferis+11, '$'

mov dl, nuskaitymoBuferis+1
add dl, 30h
mov ah, 02h
int 21h


mov ah, 4ch
mov al, 00h
int 21h

end pr1

例如,如果输入是:'test',程序输出:'4est'

在MSDOS中一个"goto to the start of the next line"分两步执行"goto start column"和"goto next line",十六进制:0Dh(Carriage Return = CR),0Ah(Line Feed = LF ).当您按下 ENTER 按钮时,计算机只会得到一个 CR,它由 INT 21h / AH=0Ah 执行并存储到 nuskaitymoBuferis。光标现在位于行首,但不在下一行 - 并且打印了“4”。

TL;DR... 在 INT 21h / AH=0Ah:

后面插入一个换行符
...
mov dx, offset nuskaitymoBuferis
mov ah, 0Ah
int 21h
mov nuskaitymoBuferis+11, '$'           ; not really good ;-)

mov dl, 0Ah
mov ah, 02h
int 21h
...

int 21h / ah=02h 输出的字符不超过一个。字符串 "test" 在您键入时会回显到控制台。然后在同一行的开头打印字符“4”,得到“4est”。

如果您希望“4”出现在新行上,请打印换行符。 IE。在打印字符串长度之前,执行:

mov dl,10  ; linefeed
mov ah,2
int 21h

您的代码中还有其他几个问题。 nuskaitymoBuferis db 11 保留 space 11 个字节;它为值为 11 的单个字节保留 space。要为 11 个字节保留 space,您可以使用 nuskaitymoBuferis db 11 dup(0).

即使进行了该更改,您仍然会在 mov nuskaitymoBuferis+11, '$' 处出现缓冲区溢出,因为您正在尝试写入 11 字节缓冲区的第 12 个字节(记住偏移量从零开始)。