程式語言 - Wine - Assembly (ARM 32) - Set Timer



參考資訊:
http://www.winprog.org/tutorial/
http://winapi.freetechsecrets.com/win32/
https://github.com/gammasoft71/Examples_Win32
http://masm32.com/board/index.php?topic=3584.0
https://learn.microsoft.com/en-us/windows/win32/winmsg/window-styles

Windows的Timer中斷週期是基於早期系統架構,因此,最短的Timer時間間隔為15ms,因此,即使Timer設定為1ms,觸發時間依舊為15ms

main.s

    .include "head.inc"
 
    .text
WndProc:
    push { r4, lr }
    ldr r4, =WM_TIMER
    cmp r1, r4
    beq handle_timer
    cmp r1, #WM_CLOSE
    beq handle_close
    cmp r1, #WM_DESTROY
    beq handle_destroy
    b handle_default

handle_timer:
    push { r0 }
    ldr r0, =dwCnt
    ldr r2, [r0]
    add r2, #1
    str r2, [r0]
    ldr r1, =FMT_TIMER
    ldr r0, =pBuf
    bl sprintf
 
    ldr r1, =pBuf
    pop { r0 }
    bl SetWindowTextA
    eor r0, r0
    b finish

handle_close:
    bl DestroyWindow
    eor r0, r0
    b finish
 
handle_destroy:
    mov r1, #1
    bl KillTimer

    ldr r0, =0
    bl PostQuitMessage
    eor r0, r0
    b finish
 
handle_default:
    push { r3 }
    mov r3, r2
    mov r2, r1
    mov r1, r0
    ldr r0, =pDefWndProc
    ldr r0, [r0]
    bl CallWindowProcA
    add sp, sp, #4
    b finish
 
finish:
    pop { r4, pc }
 
WinMain:
    push { lr }
 
    ldr r3, =0
    ldr r2, =0
    ldr r1, =0
    ldr r0, =0
    push { r0, r1, r2, r3 }
    ldr r3, =300
    ldr r2, =300
    ldr r1, =0
    ldr r0, =0
    push { r0, r1, r2, r3 }
    ldr r3, =WS_OVERLAPPEDWINDOW | WS_VISIBLE
    ldr r2, =szAppName
    ldr r1, =WC_DIALOG
    ldr r0, =WS_EX_LEFT
    bl CreateWindowExA
    add sp, sp, #32
    ldr r1, =hWin
    str r0, [r1]
 
    ldr r2, =WndProc
    ldr r1, =GWL_WNDPROC
    bl SetWindowLongA
    ldr r1, =pDefWndProc
    str r0, [r1]

    mov r3, #0
    mov r2, #1000
    mov r1, #1
    ldr r0, =hWin
    ldr r0, [r0]
    bl SetTimer 
loop:
    ldr r3, =0
    ldr r2, =0
    ldr r1, =0
    ldr r0, =szMsg
    bl GetMessageA
 
    cmp r0, #0
    beq exit
   
    ldr r0, =szMsg
    bl DispatchMessageA
    b loop
 
exit:
    mov r0, #0
    bl ExitProcess
  
    pop { pc }

Line 15~27:累加數值並且顯示在視窗標題
Line 37~38:不使用Timer,記得關閉Timer
Line 87~92:設定Timer為每秒(1000ms)觸發一次,ID=1

編譯、執行

$ winegcc main.s -o main
$ wine ./main.exe