【问题标题】:DOS Assembly program reading from pipe从管道读取的 DOS 汇编程序
【发布时间】:2014-05-22 14:59:05
【问题描述】:

作为一项脑力练习,我正在重新熟悉 DOS 汇编程序。我设置了 DOSBox 来编写和测试程序,发现它缺少“更多”命令,所以我决定自己编写。大体流程是:

  1. 从命令行读取参数
  2. 打开命令行命名的文件 (3dh, int 21h)
  3. 将文件读入内存(3fh,int 21h)
  4. 关闭文件(3eh,int 21h)
  5. 一次显示文件 23 行,空格键或 q 暂停
  6. 退出

程序在以文件名作为参数运行时效果很好。然后我想将它扩展为从重定向输入工作,所以我添加了一个测试以查看 stdin 是否有任何数据(函数 0bh,int 21h),如果有,则将 stdin 的文件句柄设置为 0。

问题是,一旦数据被读入缓冲区并关闭文件,按键就不起作用(仍然被重定向?)文件的前 23 行与“更多”提示一起显示,但后来它卡住了。获得重定向输入并仍然能够访问键盘的正确方法是什么?

【问题讨论】:

  • 也许不是您正在寻找的解决方案,但是如何从端口 60H 读取以提示您获取扫描码(假设在您的场景中仍然有效)?
  • 这是个好主意。不过,我仍然想知道,是否有使用重定向标准输入的“最佳实践”。

标签: assembly dos io-redirection dosbox


【解决方案1】:

您可以使用 BIOS 中断 0x13 来读取键盘。

真正的 MS-DOS 在使用中断 0x21 读取键盘时会间接调用中断 0x13。

我不确定 DOSBox 是否支持中断 0x13。

【讨论】:

  • 你的意思是中断 16 小时。 13h是磁盘接口... DOSBox应该支持它,因为没有BIOS中断支持将很难运行任何DOS程序。这是一个很少有任何复杂性的应用程序,至少没有进行几次 BIOS 调用!
  • 我最终使用了 BIOS int 16h。它确实起到了作用。谢谢你提醒我。已经有一段时间了。
猜你喜欢
  • 1970-01-01
  • 2011-10-14
  • 1970-01-01
  • 1970-01-01
  • 2011-05-23
  • 2017-10-06
  • 2011-12-13
  • 2017-06-16
  • 2013-01-26
相关资源
最近更新 更多