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 个字节(记住偏移量从零开始)。
我需要获取字符串长度,我的程序成功地做到了,但是它也输出了没有第一个字母的初始字符串。
.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 个字节(记住偏移量从零开始)。