【汇编程序】实现函数功能周期性执行(多媒体定时器)

    xiaoxiao2022-07-04  103

    程序需求:使用Windows系统提供的定时器API函数,实现每隔一秒钟输出当前时间。编程思路:C中需要包含Winmm.lib这个库即可,汇编中也需要包含这个库,同时需要进行函数的声明。获取当前时间的函数使用的是GetLocalTime函数,汇编中也需要声明,由于汇编中没有SYSTEMTIME结构体,就自己定义了一块大小相同的内存区域,然后使用偏移的方式访问。

    开发环境

    Win10 + VS2017

    C语言代码实现如下:

    #include <Windows.h> #include <stdio.h> #pragma comment(lib,"Winmm.lib") VOID CALLBACK TimerProc( UINT uTimerID, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2) { static SYSTEMTIME st; GetLocalTime(&st); printf("Now Time is d:d:d\n",st.wHour,st.wMinute,st.wSecond); } int main() { MMRESULT timer_id = timeSetEvent(1000, 0, TimerProc, NULL, TIME_PERIODIC); getchar(); timeKillEvent(timer_id); return 0; }

    汇编语言代码实现如下:

    INCLUDELIB kernel32.lib INCLUDELIB ucrt.lib INCLUDELIB legacy_stdio_definitions.lib INCLUDELIB Winmm.lib .386 .model flat,stdcall ExitProcess PROTO, dwExitCode:DWORD _getch PROTO C printf PROTO C : dword,:vararg scanf PROTO C : dword,:vararg GetLocalTime PROTO, lpSystemTime:DWORD timeSetEvent PROTO, uDelay:DWORD, uResolution:DWORD, lpTimeProc:DWORD, dwUser:DWORD, fuEvent:DWORD timeKillEvent PROTO, uTimerID:DWORD .data systemtime word 0,0,0,0,0,0,0,0 format byte 'Now Time is d:d:d',10,0 .code Timer Proc mov eax,offset systemtime push eax call GetLocalTime invoke printf,offset format,[systemtime+08],[systemtime+10],[systemtime+12] ret 14h Timer endp main Proc push 1h push 0h push offset Timer push 0h push 1000 call timeSetEvent invoke _getch;用于阻塞,防止程序退出 push eax call timeKillEvent push 0h call ExitProcess main endp end main

    编译运行后结果如下:

    最新回复(0)