Tasm int 21h ah = 02h输出多个字符

时间:2015-09-30 08:05:35

标签: assembly tasm

我需要获取字符串长度编号,这是我的程序成功完成的,但是它也会输出没有第一个字母的初始字符串。

.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'

2 个答案:

答案 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
...