【问题标题】:Assembly x86 - timing events大会 x86 - 计时事件
【发布时间】:2014-05-29 15:39:28
【问题描述】:

我正在使用 TASM 编译的 DosBox 模拟器(在 Windows7 上)上运行 Assembly x86 代码。 到目前为止,在我的代码中,我只使用嵌套循环来延迟代码,但现在我正在以不同的循环速率运行我的代码,我发现这不是最好的解决方案。在网上搜索代码示例或如何创建计时器并使用它而不是嵌套循环的中断是没有用的,我只在维基百科上看到了一些关于我不理解的称为 PIT 的模糊示例。

有人可以提供一个有效的代码示例来说明如何做到这一点吗?谢谢!

编辑

我尝试使用此代码使用 int 21h 中断进行延迟,但由于某种原因,它比预期的 20 1/100 秒慢了很多。也许这可以修复?

redo:   mov ah, 2ch
        int 21h     ;MILIS IN DL            ;BUG HERE -> FIX TIMER
        cmp dl, 79
        jnc redo
        mov milis, dl
loop1:  mov ah, 2ch
        int 21h
        sub dl, milis
        cmp dl, 20
        jc loop1

【问题讨论】:

  • 定时操作要么与特定的操作系统或特定的硬件平台密切相关。请添加适当的标签。我会删除不相关的标签。
  • 既然这是在DOSBOS模拟器之上,你确定这很重要吗?
  • 您可以选择连接到(模拟的)x86、BIOS 或 MSDOS。现在已经发布了代码,很明显您使用的是后者。
  • @wallyk 好的,但是您发现该代码有什么问题吗?
  • 我对魔法常量79 和20 感到困惑:它们是什么意思?另请注意,DL 中返回的 0.01 秒计数通常不会增加 1。见this。

标签: assembly x86 dosbox


【解决方案1】:

在 DOS 的世界中,有很多方法可以实现延迟。 bios 维护一个时间计数器,该计数器每秒或每 55 毫秒递增 18.2 次,因此您可以询问该计数器并循环,直到根据您想要延迟的时间来通过适当的滴答声。您可以从地址 40:6C 的 BIOS 数据区读取 4 字节计数器值。

但更简单的方法是使用中断 15h 函数 86h,这是 bios 实现的延迟。我不确定它在 DosBOX 中是否有效,但从技术上讲应该可以。

这是一个参考

http://www.ctyme.com/intr/rb-1525.htm

【讨论】:

    猜你喜欢
    • 2020-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-01
    • 2020-12-16
    相关资源
    最近更新 更多