Добрый вечер, уважаемые кодеры. Написал программу, которая должна выполнять функцию цифрового метронома (прибор, способный производить произвольное количество тактовых долей времени на слух; служит как вспомогательный прибор для установления точного ритма в музыкальном произведении.) Алгоритм простой, но и тут умудрился наступить на грабли. При изменении ритма (значения перем. position) ползунком трекбар-контрола программа завершает свою работу. Посмотрел в olly, ошибка в переполнении eax при выполнении команд div и mul; я позволил себе не делать проверку на переполнение, поскольку результат в eax после выполнения команд умножения и деления не может превышать значения 240*100/3=8000 (если не прав, готов пройти экзекуцию ремнем и до конца дней своих читать книги по азму . Еще одна проблема в вызове функции MessageBeep, она упорно не хочет работать. Пожалуйста, подскажите, как исправить ошибки. Thx. Код (Text): .386 .model flat, stdcall option casemap:none ;includes ; ««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««« include C:\masm32\include\windows.inc include C:\masm32\include\kernel32.inc include C:\masm32\include\user32.inc include C:\masm32\include\gdi32.inc include C:\masm32\include\comctl32.inc includelib user32.lib includelib kernel32.lib includelib gdi32.lib includelib comctl32.lib .data ; ««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««« format_string db "%03i",0 position dd 120 TimerValue dd 1000 status dd 0 .data? ; ««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««« icex INITCOMMONCONTROLSEX <> buffer db 4 dup (?) .const ; ««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««« IDD_DLG1 equ 1000 IDC_TRB1 equ 1001 IDC_MIN equ 1002 IDC_MAX equ 1003 IDC_START equ 1004 IDC_STOP equ 1005 IDT_TIMER equ 1 ;procedures prototypes DialogProc proto :dword,:dword,:dword,:dword TimerInit proto :dword ; ««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««« .code ; ««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««« start: mov icex.dwSize,sizeof INITCOMMONCONTROLSEX mov icex.dwICC,0FFFFh invoke InitCommonControlsEx,addr icex xor ebx,ebx invoke GetModuleHandle,ebx invoke DialogBoxParam,eax,IDD_DLG1,ebx,offset DialogProc,ebx invoke ExitProcess,eax DialogProc proc uses ebx ecx edx esi edi hwin:dword, umsg:dword, wparam:dword, lparam:dword ; ««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««« local hdc:HDC local ps:PAINTSTRUCT local rect:RECT .if umsg == WM_INITDIALOG invoke SendDlgItemMessage,hwin,IDC_TRB1,TBM_SETRANGEMIN,FALSE,60 invoke SendDlgItemMessage,hwin,IDC_TRB1,TBM_SETRANGEMAX,FALSE,240 invoke SendDlgItemMessage,hwin,IDC_TRB1,TBM_SETPOS,TRUE,position invoke SetFocus,hwin invoke SetTimer,IDT_TIMER,NULL,TimerValue,NULL .elseif umsg == WM_TIMER .if status == 1 invoke MessageBeep,-1 .endif .elseif umsg == WM_HSCROLL mov eax,wparam and eax,0FFFFh ; ??? .if eax == SB_THUMBPOSITION mov eax,wparam shr eax,16 mov position,eax invoke InvalidateRect,hwin,NULL,FALSE invoke TimerInit,hwin .elseif eax == SB_THUMBTRACK mov eax,wparam shr eax,16 mov position,eax invoke InvalidateRect,hwin,NULL,FALSE invoke TimerInit,hwin .endif .elseif umsg == WM_PAINT invoke wsprintf,offset buffer,offset format_string,position add esp,12 invoke BeginPaint,hwin, addr ps mov hdc,eax invoke TextOut,hdc,130,20,offset buffer,3 invoke EndPaint,hwin,addr ps .elseif umsg == WM_COMMAND .if wparam == IDC_START mov status,1 .elseif wparam == IDC_STOP mov status,0 .endif .elseif umsg == WM_CLOSE invoke EndDialog,hwin,0 invoke KillTimer,hwin,IDT_TIMER .endif xor eax,eax ret DialogProc endp TimerInit PROC hwin:dword local divis:dword local multipl:dword mov divis,3 mov multipl,50 pusha xor eax, eax mov eax, position ; current TrackBar value div divis ; error - integer overflow!!! mul multipl ; error - integer overflow!!! mov TimerValue,eax ;TimerValue = position / 60 * 1000 = position / 3 * 50 invoke KillTimer,hwin,IDT_TIMER invoke SetTimer,IDT_TIMER,NULL,TimerValue,NULL popa ret TimerInit ENDP ; ««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««« end start
виноват, надо было читать доку на div/mul, а потом уж вопросы задавать. invoke SetTimer,IDT_TIMER,NULL,TimerValue,NULL :/ исправил на invoke SetTimer,hwin,IDT_TIMER,TimerValue,NULL Большое спасибо!