我需要获取字符串长度编号,这是我的程序成功完成的,但是它也会输出没有第一个字母的初始字符串。
.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'
答案 0 :(得分:3)
int 21h / ah=02h
未输出多个字符。键入时,字符串“test”将回显到控制台。然后在同一行的开头打印字符'4',这将为您提供“4est”。
如果希望“4”出现在新行上,请打印换行符。即在打印字符串长度之前,请执行:
mov dl,10 ; linefeed
mov ah,2
int 21h
您的代码中还有其他一些问题。 nuskaitymoBuferis db 11
不为11个字节保留空间;它为值为11的单个字节保留空间。要为11个字节保留空间,请使用nuskaitymoBuferis db 11 dup(0)
。
即使有了这个改变,你仍然会在mov nuskaitymoBuferis+11, '$'
处有一个缓冲区溢出,因为你试图写入一个11字节缓冲区的第12个字节(记住偏移量从零开始)。
答案 1 :(得分:1)
在MSDOS a"转到下一行的开头"分两步执行"转到开始列"并且"转到下一行",十六进制:0Dh(回车= CR),0Ah(换行= 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
...