INT 21h 09h 问题
INT 21h 09h issue
我是汇编新手,我不明白为什么这个简单程序的输出如此奇怪。程序读取一行,然后只需将其打印回新行即可。我故意让 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
但我得到的输出是:
您可能希望每次循环都重新加载 buf
的第二个字节,该字节指示可以从缓冲区中处理之前的字符数。
根据出色的 Ralf Brown's interrupt list, the int 21, fn 0a
调用 修改 该字节为实际读取的字符数(无回车 return)。
因此,下次调用它时,它不会像您最初设置的那样为零。
事实上,您可能想要重新加载 整个 输入缓冲区,因为该调用不会自动终止带有 $
的字符串 - 较短的第二个输入行最后可能还有第一行输入的结尾。
所以基本上,您需要按如下方式修改接受输入的代码片段(如果这是课堂作业,我使用了类似 C 的伪代码):
mov ah, 0Ah
mov dx, offset buf
; store zero byte into buf re-use count: buf[1] = '[=10=]'
int 21h
; put '$' byte after end of string: buf[2 + buf[1]] = '$'
我是汇编新手,我不明白为什么这个简单程序的输出如此奇怪。程序读取一行,然后只需将其打印回新行即可。我故意让 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
但我得到的输出是:
您可能希望每次循环都重新加载 buf
的第二个字节,该字节指示可以从缓冲区中处理之前的字符数。
根据出色的 Ralf Brown's interrupt list, the int 21, fn 0a
调用 修改 该字节为实际读取的字符数(无回车 return)。
因此,下次调用它时,它不会像您最初设置的那样为零。
事实上,您可能想要重新加载 整个 输入缓冲区,因为该调用不会自动终止带有 $
的字符串 - 较短的第二个输入行最后可能还有第一行输入的结尾。
所以基本上,您需要按如下方式修改接受输入的代码片段(如果这是课堂作业,我使用了类似 C 的伪代码):
mov ah, 0Ah
mov dx, offset buf
; store zero byte into buf re-use count: buf[1] = '[=10=]'
int 21h
; put '$' byte after end of string: buf[2 + buf[1]] = '$'