Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с таймерами 
:(
    Опции темы
igorka
Дата 31.8.2007, 01:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 28.6.2007

Репутация: нет
Всего: нет



Ребята, помогите, чесслово очень надо. Я сам то пишу на C++\Java, а тут востал вопрос написать прогу на ASM, да еще и под винду.
А я то в АСМе ноль. Задание выглядит приблизительно так:

"Создать приложение, работающее с двумя таймерами. Один таймер настраивается на период 0,5 секунд и запускает процедуру таймера, которая получает системное время и формирует строку для вывода. Второй таймер настраивается на период 1 секунда. С этой периодичностью приложение выводит время и дату в окно редактирования, расположенное на диалоговом окне."

Кто чем можете, помогите. С радостью приму ссылки на ресурсы(в умереном кол-ве), а лучше варианты алгоритмов и реализации с пояснениями. Мне очень важно 100% понимание работы всео приложения.
PM MAIL   Вверх
igorka
Дата 31.8.2007, 19:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 28.6.2007

Репутация: нет
Всего: нет



Вообщем, порылся, нарыл кое-че, покопался, и все- стопор:

dialog.asm
Код
.386p
;плоская модель памяти
.model flat, stdcall
include dialog.inc
; подключения библиотек
includelib c:\masm32\lib\user32.lib
includelib c:\masm32\lib\kernel32.lib


; сегмент данных
_data segment dword public use32 'data'

newhwnd dd 0
;msg msgstruct <?>
hinst dd 0 ;дескриптор приложения
pa db "DIALOG",0
buf1 db 40 dup (0)
buf2 db 40 dup (0)

_data ends

;сегмент кода
_text segment dword public use32 'code'

start:
;получить дескриптор приложения
push 0
call getmodulehandlea@4
mov [hinst], eax

;------------------------------
;загрузить строку
push 40
push offset buf1
push 1
push [hinst]
call LoadStringA@16

;загрузить строку
push 40
push offset buf2
push 2
push [hinst]
call LoadStringA@16

;--------------------------------
push 0 ;MB_OK
push offset buf1
push offset buf2
push 0
call MessageBoxA@16

;создать диалоговое окно
push 0
push offset wndproc; процедура окна
push 0
push offset pa; название ресурса (DIALOG)
push [hinst]
call DialogBoxParamA@20
cmp eax,-1
jne kol

kol:
;---------------------
push 0
call ExitProcess@4
;---------------------
;процедура диалогового окна
;расположение параметров в стеке
;[ebp+014h] ;lparam
;[ebp+10h] ;wparam
;[ebp+0ch] ;mes
;[ebp+08h] ;hwnd

wndproc proc
 push ebp
 mov ebp,esp
 push ebx
 push esi
 push edi
;--------------------
cmp dword ptr [ebp+0ch],wm_close
jne l1
push 0
push dword ptr [ebp+08h]
call EndDialog@8
jmp finish

l1:
 cmp dword ptr [ebp+0ch], wm_initdialog
 jne finish
 
;загрузить пиктограмму
 push 3; идентификатор пиктограммы
 push [hinst]; идентификатор процесса
 call LoadIconA@8

;установить пиктограмму
 push eax
 push 0; тип пиктограммы (маленькая)
 push wm_seticon
 push dword ptr [ebp+08h]
 call SendMessageA@16

finish:
 pop edi
 pop esi
 pop ebx
 pop ebp
 mov eax,0
 ret 16

wndproc endp
_text ends
end start


dialog.rc

Код
// определение констант
#define ws_sysmenu 0x00080000L
#define ws_minimizebox 0x00020000L
#define ws_maximizebox 0x00010000L

//идентификаторы
#define title 1
#define content 2
#define idi_icon1 3

//определили пиктограмму
idi_icon1 icon "dialog.ico"

//определение диалогового окна
dial1 dialog 0,0,240,120
style ws_sysmenu | ws_minimizebox | ws_maximizebox
caption "Пример диалогового окна"
font 8, "Arial"
{
}
//определение строк
stringtable
{
title, "Dialog window"
content, "Dialog window content"
}

 
dialog.inc

Код
;константы
;сообщение приходит при закрытии окна
wm_close equ 10h
wm_initdialog equ 110h
wm_seticon equ 80h


;прототипы внешних процедур
extern MessageBoxA@16:near
extern ExitProcess@4:near
extern GetModuleHandleA@4:near
extern DialogBoxParamA@20:near
extern EndDialog@8:near
extern LoadStringA@16:near
extern LoadIconA@8:near
extern SendMessageA@16:near


dialog_build.cmd

Код
ml /c /coff dialog.asm
rc dialog
link /SUBSYSTEM:WINDOWS /LIBPATH:c:\masm32\lib dialog.obj dialog.res
pause



Вот все что я пока нацарапал, с помощью инетаsmile, не густо... Дальше стопор. 
Все намана в коде, или что-то глупо, что-то не так?
Первый вопрос, как сделать подходящий компонет(Ы)для вывода даты и текста, ну типа textArea? Или хотяб как добавить еще одну строчку на мое окошко, обьясните плз?
Сделаю ГУИ, а потом дойдем и до самих таймеров;)
PM MAIL   Вверх
igorka
  Дата 2.9.2007, 01:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 28.6.2007

Репутация: нет
Всего: нет



Нацарапал какой-то код. Не удивительно, но не работает. Собирается, но вот таймеры не запускаются. 
Что я не так делаю?
Может более коректно будет использовать SendDlgItemMessageA@20?

dialog.asm

Код

; #########################################################################

      .386
      .model flat, stdcall
      option casemap :none   ; case sensitive

; #########################################################################

      include \masm32\include\windows.inc
      include \masm32\include\user32.inc
      include \masm32\include\kernel32.inc
      
      includelib \masm32\lib\user32.lib
      includelib \masm32\lib\kernel32.lib

; #########################################################################

        ;=============
        ; Local macros
        ;=============
  
        szText MACRO Name, Text:VARARG
          LOCAL lbl
            jmp lbl
              Name db Text,0
            lbl:
          ENDM
         
                
        ;=================
        ; Local prototypes
        ;=================
        WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
                
                EXTERN     SetTimer@16:NEAR 
    
        
    .data
        dlgname       db "TESTWIN",0
        hInstance     dd 0
        date_str db "yy/MM/dd",0
                time_str db "HH:mm:ss",0
    .code

start:

; #########################################################################

        invoke GetModuleHandle, NULL
        mov hInstance, eax
        
        ; -------------------------------------------
        ; Call the dialog box stored in resource file
        ; -------------------------------------------
        invoke DialogBoxParam,hInstance,ADDR dlgname,0,ADDR WndProc,0
        
        ;Инициализация первого таймера
        ;Таймер работает с интервалом 500 и запускает 2-й таймер
                
        PUSH OFFSET SecondTimerProc         ;Интервал 0.5 с 
        PUSH 1                              ;Идентификатор таймера 
        PUSH DWORD  PTR  [EBP+08H] 
        CALL SetTimer@16 
                
        invoke ExitProcess,eax

; #########################################################################

WndProc proc hWin   :DWORD,
             uMsg   :DWORD,
             wParam :DWORD,
             lParam :DWORD

      .if uMsg == WM_INITDIALOG
        szText dlgTitle,"Date\Time Dialog"
        invoke SendMessage,hWin,WM_SETTEXT,0,ADDR dlgTitle

      .elseif uMsg == WM_CLOSE
        invoke EndDialog,hWin,0

      .endif

    xor eax, eax
    ret

WndProc endp

; ########################################################################
;Процедура вызова второго таймера
;Задержка таймера 1000
;Таймер выводит текущие дату и время
SecondTimerProc proc

PUSH OFFSET DataOutProc         ;Интервал 1 с 
PUSH 2                          ;Идентификатор таймера 
PUSH DWORD  PTR  [EBP+08H] 
CALL SetTimer@16 

SecondTimerProc endp
; ########################################################################
;Процедура получает текущие дату и время и отображает их в окне
DataOutProc proc

;date_srt = getDate()
;time_str = getTime()
invoke   SetDlgItemText, [hInstance], 40, addr date_str
invoke   SetDlgItemText, [hInstance], 50, addr time_str

DataOutProc endp
; ########################################################################

end start


dialog.rc

Код

#include "\masm32\include\resource.h"


TESTWIN DIALOGEX MOVEABLE IMPURE LOADONCALL DISCARDABLE 10, 10, 100, 50, 0
STYLE DS_MODALFRAME | 0x0004 | DS_CENTER | WS_CAPTION | WS_SYSMENU | WS_VISIBLE | WS_POPUP
CAPTION "Date\Time Dialog"
FONT 16, "MS Sans Serif"
BEGIN
    CTEXT           "Date",       20,      0,10,40,10, SS_CENTER, , 0
    CTEXT           "Time",       30,      0,30,40,10, SS_CENTER, , 0
    CTEXT           "date_value", 40,      50,10,40,10, SS_CENTER, , 0
    CTEXT           "time_value", 50,      50,30,40,10, SS_CENTER, , 0
END


Надо ли делать KillTimer@8 и где это надо делать?


PS.
Спасибо Винграду за активную помощ ;-)

PM MAIL   Вверх
W4FhLF
Дата 2.9.2007, 22:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 1
Всего: 121



Отдельные процедуры обязательно нужны? Просто здесь и без них всё довольно просто.

prog.asm:

Код

.686
.model flat,stdcall
option casemap:none

            include kernel32.inc
            include    user32.inc
            include    windows.inc
            include masm32.inc
            

            includelib kernel32.lib
            includelib user32.lib
            includelib masm32.lib

DlgProc        proto    :dword,:dword,:dword,:dword
            
.const
    IDD_DIALOG        equ    100
    IDD_EDIT        equ 102
    ID_TIMER0        equ 400
    ID_TIMER1        equ 401

.data
    lpFmtTime    db    "%.2u:%.2u:%.2u",0

.data?
    hInstance        HINSTANCE  ? 
    SystemTime        SYSTEMTIME <?>
    lpOut            db    255 dup(?)

.code

start:
    
    invoke    GetModuleHandle,0
    mov    hInstance,eax
    invoke    DialogBoxParam,hInstance,IDD_DIALOG,0,addr DlgProc,0
    invoke    ExitProcess,eax

DlgProc            proc    uses ebx edi esi,hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM

            
            cmp    uMsg,WM_CLOSE
            jz    @close

            cmp    uMsg,WM_DESTROY
            jz    @destroy
            
            cmp    uMsg,WM_INITDIALOG
            jz    @init
            
            cmp    uMsg,WM_TIMER
            jz    @timer
            
            xor    eax,eax
            ret

@timer:        cmp wParam, ID_TIMER0
            jne @f
                invoke GetSystemTime, offset SystemTime
                xor eax,eax
                mov ax,SystemTime.wSecond
                push eax
                mov ax,SystemTime.wMinute
                push eax
                mov ax, SystemTime.wHour
                push eax
                invoke wsprintf, addr lpOut, addr lpFmtTime
            @@:
                invoke SendDlgItemMessageA, hWnd, IDD_EDIT, WM_SETTEXT, 0, offset lpOut
                
            jmp @endcheck


@init:        invoke SetTimer, hWnd, ID_TIMER0, 500, 0
            invoke SetTimer, hWnd, ID_TIMER1, 1000, 0

            jmp @endcheck

@destroy:    invoke KillTimer, hWnd, ID_TIMER0
            invoke KillTimer, hWnd, ID_TIMER1
            
            jmp @endcheck

@close:        invoke    EndDialog,hWnd,0
            
@endcheck:    mov    eax,1
            ret

DlgProc            endp
end start


rc.rc:

Код

#include "C:/masm32/include/resource.h"
100 DIALOGEX 130,108,192,80
CAPTION "Timer"
FONT 8,"MS Sans Serif"
STYLE 0x10C80802
EXSTYLE 0x00000000
BEGIN
  CONTROL "",102,"Edit",0x50810080,24,1,162,13,0x00000000
END


com.bat:

Код

set cmpl=C:\masm32
%cmpl%\bin\rc.exe RC.rc
%cmpl%\bin\cvtres.exe /nologo /machine:ix86 RC.res
%cmpl%\bin\ml /nologo /c /coff /Cp /I %cmpl%\include\ prog.asm
%cmpl%\bin\link /NOLOGO /SUBSYSTEM:WINDOWS /LIBPATH:%cmpl%\lib prog.obj RC.obj
del *.res
del *.obj
pause



Это сообщение отредактировал(а) W4FhLF - 2.9.2007, 22:00


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для Windows/DOS"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для Windows/Dos | Следующая тема »


 




[ Время генерации скрипта: 0.0508 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.