INT 21h 09h问题

时间:2016-10-22 08:54:47

标签: assembly x86-16 tasm

我是汇编的新手,我无法理解为什么我这个简单程序的输出如此奇怪。程序读取一行,然后只需将其打印回新行。我故意让io循环无限多次执行算法。

.model small
.stack 100h
.data

    msg db "Write something: ", "$"
    buf db 255, 0, 255 dup("$")
    newline db 13, 10, "$"

.code
start:
    mov ax, @data
    mov ds, ax

    io:
    mov ah, 09h
    mov dx, offset newline
    int 21h

    mov ah, 09h
    mov dx, offset msg
    int 21h

    mov ah, 0Ah
    mov dx, offset buf
    int 21h

    mov ah, 09h
    mov dx, offset newline
    int 21h

    mov ah, 09h
    mov dx, offset buf+2
    int 21h

    mov ah, 09h
    mov dx, offset newline
    int 21h

    jmp io

    done:
    mov ah, 4Ch
    int 21h

end start 

但我得到的输出是: enter image description here

1 个答案:

答案 0 :(得分:0)

您可能希望每次通过循环重新加载buf的第二个字节,该循环指示可以从缓冲区处理多少个先前字符。

根据优秀的Ralf Brown's interrupt listint 21, fn 0a调用修改该字节为实际读取的字符数(无回车)。

因此,下次您调用它时,它不会像您最初设置的那样为零。

实际上,您可能想重新加载整个输入缓冲区,因为该调用不会自动终止$字符串 - 较短的第二条输入线可能仍然存在在结尾处有第一个输入行的结尾。

所以基本上,您需要修改接受输入的代码段,如下所示(我已经使用了类似C的伪代码,如果这是类作业):

mov ah, 0Ah
mov dx, offset buf
; store zero byte into buf re-use count: buf[1] = '\0'
int 21h
; put '$' byte after end of string: buf[2 + buf[1]] = '$'