DOS中断问题与int 21h 0ah

逆向工程 部件
2021-06-21 00:23:20

我有这个汇编代码,它读取一个 120 字节的字符串。如果我尝试通过按一个键直到它停止写入来填充缓冲区,则输入键不起作用。我数了一下字数,发现写了121个字。

这是正常的吗?有没有办法避免它?也许是另一个中断?

代码:

.model small
.stack 100h
.386
.data 
    MSG DB "Please give me the string (max 120 chars): ", 10, 13, "$"
    Sentence1 DB 121,?,121 dup(0)
.code
start:
    mov ax, @data
    mov ds, ax

    mov ah,09h
    lea dx,A
    int 21h

    xor ax,ax        
    mov dx, offset Sentence1
    mov ah, 0Ah
    int 21h
    xor bx,bx
    mov bl, Sentence1[1]
    mov Sentence1[bx+2], '$' 

    mov ah, 4ch
    int 21h
end start  

一个例子(假设是一个 11 字节的缓冲区,而不是 121 字节,为简洁起见):

Please give me the string (max 10 chars):
AAAAAAAAAAA
\_________/
     |
    11 As

如果我此时按 Enter 它不起作用,但是如果我删除 A 并按 Enter,则它起作用。

我使用 Tasm 和 Tlink 进行编译。

问候。

[编辑] 一个错字。

1个回答

这是正常的吗?

是的。

有没有办法避免它?

您可以使用Ctrl+CCtrl+Break退出缓冲输入模式(这会导致INT 23h)。

也许是另一个中断?

您可以使用多种 DOS 中断服务来读取输入,但INT 21h/AH=01h可能是下一个最佳选择。