【问题标题】:INT 21h 09h issueINT 21h 09h 问题
【发布时间】:2016-10-22 08:54:46
【问题描述】:

我是汇编新手,我不明白为什么我会从这个简单的程序中得到如此奇怪的输出。程序读取一行,然后只需将其打印回新行。我故意让 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 

但我得到的输出是:

【问题讨论】:

  • 循环播放时您没有正确设置结尾。再次调用 0Ah 时,您不会重置缓冲区的值。从这些开始。

标签: assembly x86-16 tasm


【解决方案1】:

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

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

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

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


所以基本上,你需要修改接受输入的 sn-p 如下(我使用了类似 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]] = '$'

【讨论】:

    猜你喜欢
    • 2016-08-15
    • 1970-01-01
    • 2012-03-22
    • 2015-07-23
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2016-03-29
    • 2020-01-28
    相关资源
    最近更新 更多