BIOS和DOS中断(16H和21H)

3
有些例程可以通过 INT 21HINT 16H 实现(前者适用于DOS,后者适用于BIOS)。但是,确切的区别不太清楚(至少对我来说是这样!)。
例如,以下例程从键盘读取字符:
1)INT 21H,服务01用于带回显的阅读。
MOV   AH,01
INT   21H

2) INT 16H,服务01用于键盘按键

MOV   AH,01
INT   16H

假设有一个等待按键的程序。例如,一个简单的基于文本的向导程序等待Y / N。为了回显按下的键,哪个更好?21H还是16H。
我认为当没有操作系统时(例如在POST期间“按F1继续”),应调用BIOS例程。这就是全部吗?是否有任何示例表明某个操作仅由它们中的一个执行,而不是两者都执行?
1个回答

2
为了回显按下的键,哪一个更好?21H还是16H。
当然,绝对不是BIOS函数,因为它不会回显任何东西!
INT 16H,服务01用于按键。
这个函数只会检查是否有可用的按键。它不会从键盘缓冲区中删除它。
总的来说,你需要注意DOS输入函数可以使用重定向。输入可能根本不来自键盘。它可能来自文件或其他来源。

正如你所说,INT 16H 只检查按键是否被按下。就像我所说的那样,使用 INT 21H 也可以实现这一点。你同意吗? - mahmood
从您的回答中,我了解到INT 21H将从缓冲区中删除键。这正确吗?关于INT 16H,为什么在检查其可用性后缓冲区中应该存在一个键? - mahmood
1
BIOS功能01h允许您预览键盘缓冲区的内容。 BIOS功能00h将有效地从相同的缓冲区中删除该键。 - Fifoernik
1
谢谢。我可以问另一个问题吗?当一个例程可以同时使用DOS和BIOS功能时,哪一个更优先呢? - mahmood
3
这个问题并没有明确的答案。你需要仔细地检查那些肯定存在的微小差别!我个人更喜欢使用 BIOS 而非 DOS。不依赖于 DOS 的例程更容易移植到没有操作系统的环境中。 - Fifoernik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接