Среда, 23.07.2025, 23:10 Приветствую Вас Гость

On-line: Книги, учебники, статьи

Главная | Регистрация | Вход | RSS

Глава 7. Использование ассемблера с языками высокого уровня(4)

// файл dialforc.rc
// определение констант
#define WS_SYSMENU 0x00080000L
// элементы на окне должны быть изначально видимы
#define WS_VISIBLE 0x10000000L
// бордюр вокруг элемента
#define WS_BORDER 0x00800000L
// при помощи TAB можно по очереди активизировать элементы
#define WS_TABSTOP 0x00010000L
// текст в окне редактирования прижат к левому краю
#define ES_LEFT 0x0000L
// стиль всех элементов на окне
#define WS_CHILD 0x40000000L
// запрещается ввод с клавиатуры
#define ES_READONLY 0x0800L
#define DS_3DLOOK 0x0004L

// определение диалогового окна
DIAL1 DIALOG 0, 0, 240, 100
STYLE WS_SYSMENU | DS_3DLOOK
CAPTION "Диалоговое окно с часами и датой"
FONT 8, "Arial"
{
 CONTROL "", 1, "edit", ES_LEFT | WS_CHILD
 | WS_VISIBLE | WS_BORDER
 | WS_TABSTOP | ES_READONLY, 100, 5, 130, 12
}

; файл dialforc.inc
; константы
; сообщение приходит при закрытии окна
WM_CLOSE equ 10h
; сообщение приходит при создании окна
WM_INITDIALOG equ 110h
; сообщение приходит при событии с элементом на окне
WM_COMMAND equ 111h
; сообщение от таймера
WM_TIMER equ 113h
; сообщение посылки текста элементу
WM_SETTEXT equ 0CH

; прототипы внешних процедур
 EXTERN SendDlgItemMessageA:NEAR
 EXTERN _wsprintfA:NEAR
 EXTERN GetLocalTime:NEAR
 EXTERN ExitProcess:NEAR
 EXTERN GetModuleHandleA:NEAR
 EXTERN DialogBoxParamA:NEAR
 EXTERN EndDialog:NEAR
 EXTERN SetTimer:NEAR
 EXTERN KillTimer:NEAR

; структуры
; структура сообщения
MSGSTRUCT STRUC
 MSHWND DD ?
 MSMESSAGE DD ?
 MSWPARAM DD ?
 MSLPARAM DD ?
 MSTIME DD ?
 MSPT DD ?
MSGSTRUCT ENDS

; структура данных дата-время
DAT STRUC
 year DW ?
 month DW ?
 dayweek DW ?
 day DW ?
 hour DW ?
 min DW ?
 sec DW ?
 msec DW ?
DAT ENDS

; файл dialforc.asm
.386P
; плоская модель
.MODEL FLAT, stdcall
include dialforc.inc
PUBLIC DIAL1
;---------------------------------------------------
; сегмент данных
_DATA SEGMENT DWORD PUBLIC USE32 'DATA'
 MSG MSGSTRUCT <?>
 HINST DD 0 ; дескриптор приложения
 PA DB "DIAL1",0
 TIM DB "Дата %u/%u/%u Время %u:%u:%u",0
 STRCOPY DB 50 DUP (?)
 DATA DAT <0>
_DATA ENDS

; сегмент кода
_TEXT SEGMENT DWORD PUBLIC USE32 'CODE'
DIAL1 PROC
 PUSH EBP
 MOV EBP,ESP
; получить дескриптор приложения
 PUSH 0
 CALL GetModuleHandleA
 MOV [HINST], EAX
; создать диалоговое окно
 PUSH 0
 PUSH OFFSET WNDPROC
 PUSH 0
 PUSH OFFSET PA
 PUSH [HINST]
 CALL DialogBoxParamA
 CMP EAX,-1
;------------------------------
 POP EBP
 RET
DIAL1 ENDP
;------------------------------

; процедура окна
; расположение параметров в стеке
; [EВР+014Н] ;LPARAM
; [EВР+10Н] ;WAPARAM
; [EВР+0CH] ;MES
; [EВР+8] ;HWND
WNDPROC PROC
 PUSH EBP
 MOV EBP,ESP
 PUSH EBX
 PUSH ESI
 PUSH EDI
;--------------------
 CMP DWORD PTR [EBP+0CH],WM_CLOSE
 JNE L1
; здесь реакция на закрытие окна
; удалить таймер 1
 PUSH 1 ; идентификатор таймера
 PUSH DWORD PTR [EBP+08H]
 CALL KillTimer
; удалить таймер 2
 PUSH 2 ; идентификатор таймера
 PUSH DWORD PTR [EBP+08H]
 CALL KillTimer ; закрыть диалог
 PUSH 0
 PUSH DWORD PTR [EBP+08H]
 CALL EndDialog
 JMP FINISH
L1:
 CMP DWORD PTR [EBP+0CH],WM_INITDIALOG
 JNE L2
; здесь начальная инициализация
; установить таймер 1
 PUSH 0 ; параметр = NULL
 PUSH 1000 ; интервал 1 с.
 PUSH 1 ; идентификатор таймера
 PUSH DWORD PTR [EBP+08H]
 CALL SetTimer
; установить таймер 2
 PUSH OFFSET TIMPROC ; параметр = NULL
 PUSH 500 ; интервал 0.5 с.
 PUSH 2 ; идентификатор таймера
 PUSH DWORD PTR [EBP+08H]
 CALL SetTimer
 JMP FINISH
L2:
 CMP DWORD PTR [EBP+0CH],WM_TIMER
 JNE FINISH
; отправить строку в окно
 PUSH OFFSET STRCOPY
 PUSH 0
 PUSH WM_SETTEXT
 PUSH 1 ; идентификатор элемента
 PUSH DWORD PTR [EBP+08H]
 CALL SendDlgItemMessageA
FINISH:
 POP EDI
 POP ESI
 POP EBX
 POP EBP
 MOV EAX,0
 RET 16
WNDPROC ENDP
;--------------------------------------------

; процедура таймера
; расположение параметров в стеке
; [EВР+014Н] ; LPARAM - промежуток запуска Windows
; [EВР+10Н] ; WAPARAM - идентификатор таймера
; [EВР+0CH] ; WM_TIMER
; [EВР+8] ; HWND
TIMPROC PROC
 PUSH EBP
 MOV EBP,ESP
; получить локальное время
 PUSH OFFSET DATA
 CALL GetLocalTime
; получить строку для вывода даты и времени
 MOVZX EAX,DATA.sec
 PUSH EAX
 MOVZX EAX,DATA.min
 PUSH EAX
 MOVZX EAX,DATA.hour
 PUSH EAX
 MOVZX EAX, DATA.year
 PUSH EAX
 MOVZX EAX,DATA.month
 PUSH EAX
 MOVZX EAX,DATA.day
 PUSH EAX
 PUSH OFFSET TIM
 PUSH OFFSET STRCOPY
 CALL _wsprintfA
; восстановить стек
 ADD ESP,32
 POP EBP
 RET 16
TIMPROC ENDP
_TEXT ENDS
END

Puc. 3.7.6. Пример использования в ассемблерном модуле API-функций и ресурсов.

Вход на сайт
Поиск
Календарь
«  Июль 2025  »
ПнВтСрЧтПтСбВс
 123456
78910111213
14151617181920
21222324252627
28293031
Архив записей
Наш опрос
Как Вам удобнее??
Всего ответов: 341
Мини-чат
Друзья сайта
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz
  • Статистика

    Онлайн всего: 1
    Гостей: 1
    Пользователей: 0