【问题标题】:How can I get a pulse in win32 Assembler (specifically nasm)?如何在 win32 汇编程序(特别是 nasm)中获得脉冲?
【发布时间】:2012-05-22 11:35:25
【问题描述】:

我打算做一个时钟。一个真正的时钟,不是 Windows 的东西。但是,我希望现在能够编写大部分代码。我将使用 PIC16F628A 来驱动时钟,它有一个我可以访问的计时器(实际上,除了它内置的时钟之外,它还有 3 个)。但是,Windows 似乎没有此功能。这使得制作时钟有点困难,因为我需要知道它已经过了多长时间,这样我才能更新当前时间。所以我需要知道如何在 Windows 中获得脉冲(1Hz、1KHz,只要我知道它有多快,这并不重要)。

【问题讨论】:

    标签: windows assembly nasm


    【解决方案1】:

    Windows 中有许多可用的计时器对象。可能最容易用于您的目的是多媒体计时器,但已被弃用。它仍然可以工作,但 Microsoft 建议使用其中一种新的计时器类型。

    如果您知道您的应用程序将在 Windows Vista、Server 2008 或更高版本下运行,我建议您使用 threadpool timer。如果您必须支持 Windows XP,请使用Timer Queue timer

    这些 API 有很多,但一般用途非常简单。我在我的文章 Using the Windows Timer Queue API 中展示了如何使用它们(在 C# 中)。代码主要是API调用,所以我想你理解和转换它不会有问题。

    LARGE_INTEGER 只是一个 8 字节的内存块,分为高部分和低部分。在汇编中,您可以将其定义为:

    MyLargeInt equ $
    MyLargeIntLow dd 0
    MyLargeIntHigh dd 0
    

    如果您想学习 ASM,只需在 Google 上搜索 [x86 汇编语言教程]。这将为您提供大量有用的信息。

    【讨论】:

    • 谢谢,你帮了大忙。
    【解决方案2】:

    您可以使用waitable timer object。由于 Windows 不是实时操作系统,因此您需要确保将周期设置得足够长,以免错过脉冲。大多数时候十分之一秒应该是安全的。

    补充:

    您需要传递给 SetWaitableTimer 的 const LARGE_INTEGER 在 NASM 中很容易实现,它只是一个八字节常量:

    period:   dq 100    ; 100ms = ten times a second
    

    period的地址作为第二个参数传递给SetWaitableTimer。

    【讨论】:

    • 看起来它可以工作,但后来我注意到 SetWaitableTimer 需要一个 LARGE_INTEGER,我不知道如何在 ASM 中创建它,特别是看到它似乎是一个 C 结构。 (我对 ASM 真的很陌生,我了解基础知识,但对如何使用它一无所知,遗憾的是那里没有任何东西可以教给我很多东西)看起来写这个可能是一个更好的主意在 C 中,但是当我将它移植到 PIC 时,可能需要 ASM,至少是内联的。无论如何,如果我知道如何应用它,我认为这可能会起作用:p
    • 查看我的编辑。请注意,您可以毫不费力地混合使用 C 和汇编程序,因此如果您愿意,可以在 C 中完成 Windows 特定的部分(无论如何您都必须重写)。
    猜你喜欢
    • 2021-05-13
    • 2017-12-26
    • 1970-01-01
    • 2013-02-06
    • 2014-12-26
    • 2011-10-14
    • 2018-09-08
    • 2011-02-21
    • 1970-01-01
    相关资源
    最近更新 更多