как под структуру типа MSG выделить строго определенное количество бай

Тема в разделе "WASM.ASSEMBLER", создана пользователем Morskoivolk, 2 апр 2007.

  1. Morskoivolk

    Morskoivolk New Member

    Публикаций:
    0
    Регистрация:
    30 янв 2007
    Сообщения:
    85
    Здравия всем!
    Подскажите пожалуйста можно ли к примеру вот под эту структуру

    MSGSTRUCT STRUC
    MSHWND DD ? ; идентификатор окна,
    ; получающего сообщение
    MSMESSAGE DD ? ; идентификатор сообщения
    MSWPARAM DD ? ; доп. информация о сообщении
    MSLPARAM DD ? ; доп. информация о сообщении
    MSTIME DD ? ; время посылки сообщения
    MSPT DD ? ; положение курсора, во время посылки
    ; сообщения
    MSGSTRUCT ENDS

    выделить, например, 300 байт? По моим исследованиям при объявлении каждой новой структуры на диске материализуется ровно 1 Кб. Зачем же занимать один Кб, если реально для этой структуры понадобится пару сотен байт. Есть ли способ использовать столько сколько тебе надо?
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    да ладно. про выравнивание слыхал?
     
  3. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Бред. Это при каком же выравнивании? 1024? :)
     
  4. Morskoivolk

    Morskoivolk New Member

    Публикаций:
    0
    Регистрация:
    30 янв 2007
    Сообщения:
    85
    ну так я и прошу помогите, разъясните. если б я знал про выравнивание, то стал бы задавать вопрос? можете на примере показать как будет выглядеть это самое выравнивание не на 1 Кб, а на другую величину?)
     
  5. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    /ALIGN:32
     
  6. Morskoivolk

    Morskoivolk New Member

    Публикаций:
    0
    Регистрация:
    30 янв 2007
    Сообщения:
    85
    т.е. получится


    MSGSTRUCT STRUC
    ALIGN 4
    MSHWND DD ? ; идентификатор окна,
    ; получающего сообщение
    MSMESSAGE DD ? ; идентификатор сообщения
    MSWPARAM DD ? ; доп. информация о сообщении
    MSLPARAM DD ? ; доп. информация о сообщении
    MSTIME DD ? ; время посылки сообщения
    MSPT DD ? ; положение курсора, во время посылки
    ; сообщения
    MSGSTRUCT ENDS

    Так?
     
  7. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    вроде нет так=\
     
  8. Morskoivolk

    Morskoivolk New Member

    Публикаций:
    0
    Регистрация:
    30 янв 2007
    Сообщения:
    85
    а как тогда?
     
  9. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Какой ассемблер? На масме выравнивание по умолчанию задаётся в объявлении сегмента. По умолчанию (.code, .data) 4, если не ошибаюсь. Так что, откуда у тебя 1 кб, не понятно.

    Если уж приспичило выровнять структуру, то делать это надо при объявлении её экземпляра:
    align 16
    msg MSG <>
     
  10. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    На сколько я знаю, в коде, align <n> не может ничего уменьшить, оно только будет вставлять нули пока текущий адрес + 1 не будет делиться на n без остатка.
    Выход есть. например можно засунуть и код и данные и еще что нибудь в одну секцию, только надо при этом выставить соответствующие права у оной.
    А так как видно что это масм, то нужно сделать как написал Great, при компиляции указать ту опцию
     
  11. Morskoivolk

    Morskoivolk New Member

    Публикаций:
    0
    Регистрация:
    30 янв 2007
    Сообщения:
    85
    вобщем написал так
    ALIGN 16
    MSG MSGSTRUCT <>


    компилятор выдал ошибку
    'invali combination with segment alignment: 16'
     
  12. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    Morskoivolk
    я всего 24 байта насчитал :)

    Если эта структура не используется нигде, кроме цикла выборки сообщений, выдели место для нее на стеке. Тогда она вообще ничего в файле занимать не будет.
     
  13. Morskoivolk

    Morskoivolk New Member

    Публикаций:
    0
    Регистрация:
    30 янв 2007
    Сообщения:
    85
    ))) 24 байта....вот имеено! на фиг 1 КЬ)))
    не мог ты поподробней описать как выделить место на стеке? или кинь ссылку, если не влом, откуда, где я это могу найти...
     
  14. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Килобайт у тебя получился, скорее всего, не от конкретно этой структуры - просто размер данных перевалил за размер файлового выравнивания и размер ехе увеличился. Но файловое выравнивание обычно 0х200, а это полкилобайта. Приведи полный код что ли.

    Код (Text):
    1. WinMain proc uses ebx, edi
    2.   local msg:MSG
    3.  
    4.   lea  edi,[msg]
    5.   xor  ebx,ebx
    6.   invoke GetMessage,edi,ebx,ebx,ebx
    7.   ...
     
  15. Morskoivolk

    Morskoivolk New Member

    Публикаций:
    0
    Регистрация:
    30 янв 2007
    Сообщения:
    85
    это вставлять в главную процедуру? точно? или же сюда
    MSG_LOOP:
    PUSH 0
    PUSH 0
    PUSH 0
    PUSH OFFSET MSG
    CALL GetMessageA@16
    CMP EAX, 0
    JE END_LOOP
    PUSH OFFSET MSG
    CALL TranslateMessage@4
    PUSH OFFSET MSG
    CALL DispatchMessageA@4
    JMP MSG_LOOP
    END_LOOP:
    ; выход из программы (закрыть процесс)
    PUSH [MSG.MSWPARAM]
    CALL ExitProcess@4
    _ERR:
    JMP END_LOOP
     
  16. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    Код (Text):
    1. BeginMessageLoop proc
    2.    push ebp
    3.    sub  esp, 24
    4.    mov ebp, esp  ; ebp указывает на начало структуры в стеке
    5.  
    6. @@:
    7.    xor eax, eax
    8.    push eax
    9.    push eax
    10.    push eax
    11.    push ebp
    12.    call GetMessage
    13.    test eax, eax
    14.    jz @f
    15.    push ebp
    16.    call TranslateMessage
    17.    push ebp
    18.    call DispatchMessage
    19.    jmp @b
    20.  
    21. @@:
    22.    add esp, 24
    23.    pop ebp
    24.    retn
    25. BeginMessageLoop endp
     
  17. Morskoivolk

    Morskoivolk New Member

    Публикаций:
    0
    Регистрация:
    30 янв 2007
    Сообщения:
    85
    вставил этот код....откомпилил....все равно размер тот же...
     
  18. Morskoivolk

    Morskoivolk New Member

    Публикаций:
    0
    Регистрация:
    30 янв 2007
    Сообщения:
    85
    rmn
    хотя объетный файл уменьшился....экзешник все равно весит 4 096 байта.
    не хочешь попробовать?
    у меня в программе 4 структуры....и как я понял, под каждую из них по 1 кб выделяется. может ты найдешь способ как под не выделять для них столько много?
    слить файл?
     
  19. Morskoivolk

    Morskoivolk New Member

    Публикаций:
    0
    Регистрация:
    30 янв 2007
    Сообщения:
    85
    люди ну кто даст врозумительный ответ, как отвести под структур столько места, сколько она на самом деле занимает??????
     
  20. Morskoivolk

    Morskoivolk New Member

    Публикаций:
    0
    Регистрация:
    30 янв 2007
    Сообщения:
    85
    вот программа. помогите пожалуйста избавиться от ненужных килобайт струтур.....

    Код (Text):
    1. .386P
    2. ; сплошная модель памяти
    3. .MODEL FLAT, stdcall
    4. ;====================================================
    5. ;константы
    6. ;====================================================
    7. WM_SETFONT        equ 30h
    8. BN_CLICKED        equ 0
    9. WM_COMMAND        equ 111h
    10. DEFAULT_CHARSET   equ 1
    11. OUT_DEFAULT_PRECIS equ 0
    12. CLIP_DEFAULT_PRECIS equ 0
    13. DEFAULT_QUALITY   equ 0
    14. DEFAULT_PITCH     equ 0
    15. WM_SETFOCUS       equ 7h
    16. WS_OVERLAPPED     equ 0h
    17. ; сообщение приходит при закрытии окна
    18. WM_DESTROY        equ 2
    19. ; сообщение приходит при создании окна
    20. WM_CREATE         equ 1
    21. WM_KEYDOWN        equ 100h
    22. SM_CXSCREEN       equ 0
    23. SM_CYSCREEN       equ 1
    24. ; сообщение, позволяющее послать элементу строку
    25. WM_SETTEXT        equ 0Ch
    26. ; сообщение, позволяющее получить строку
    27. WM_GETTEXT        equ 0Dh
    28. ; свойства окна
    29. CS_VREDRAW        equ 1h
    30. CS_HREDRAW        equ 2h
    31. CS_GLOBALCLASS    equ 4000h
    32. WS_TABSTOP        equ 10000h
    33. WS_SYSMENU        equ 50000h
    34. WS_OVERLAPPEDWINDOW    equ 000CF0000H
    35. CS_PARENTDC       equ 80h
    36. style             equ CS_PARENTDC
    37. BS_DEFPUSHBUTTON  equ 1h
    38. WS_VISIBLE        equ 10000000h
    39. WS_CHILD          equ 40000000h
    40. WS_BORDER         equ 800000h
    41. ES_AUTOHSCROLL    equ 80h
    42. WS_EX_CLIENTEDGE  equ 00000200h
    43. BS_TEXT           equ 0
    44. WINDOWSTYLE equ WS_OVERLAPPEDWINDOW
    45. STYLBTN equ WS_CHILD+BS_TEXT+WS_VISIBLE+WS_TABSTOP
    46. STYLEDT equ WS_CHILD+WS_VISIBLE+WS_BORDER+WS_TABSTOP+ES_AUTOHSCROLL
    47. STYLSTAT equ WS_CHILD+WS_VISIBLE+WS_EX_CLIENTEDGE
    48. ; идентификатор стандартной иконки
    49. IDI_APPLICATION   equ 32512
    50. IDI_WARNING       equ 32515
    51. ; идентификатор курсора
    52. IDC_ARROW         equ 32512
    53. ; режим показа окна - нормальный
    54. SW_SHOWNORMAL     equ 1
    55. COLOR_BTNFACE     equ 15
    56. ;====================================================
    57. ; прототипы внешних процедур
    58. ;====================================================
    59. EXTERN   SetFocus@4:NEAR
    60. EXTERN   SendMessageA@16:NEAR
    61. EXTERN   MessageBoxA@16: NEAR
    62. EXTERN   CreateWindowExA@48:NEAR
    63. EXTERN   DefWindowProcA@16:NEAR
    64. EXTERN   DispatchMessageA@4:NEAR
    65. EXTERN   ExitProcess@4:NEAR
    66. EXTERN   GetMessageA@16:NEAR
    67. EXTERN   GetModuleHandleA@4:NEAR
    68. EXTERN   LoadCursorA@8:NEAR
    69. EXTERN   LoadIconA@8:NEAR
    70. EXTERN   PostQuitMessage@4:NEAR
    71. EXTERN   RegisterClassA@4:NEAR
    72. EXTERN   ShowWindow@8:NEAR
    73. EXTERN   TranslateMessage@4:NEAR
    74. EXTERN   UpdateWindow@4:NEAR
    75. EXTERN   GetSystemMetrics@4:NEAR
    76. EXTERN   CreateFontIndirectA@4:NEAR
    77. EXTERN   SendMessageA@16:NEAR
    78. EXTERN   GetWindowTextLengthA@4:NEAR
    79. EXTERN   GetWindowTextLengthA@4:NEAR
    80.  
    81.  
    82. ;====================================================
    83. ; директивы компоновщику для подключения библиотек
    84. ;====================================================
    85. includelib i:\masm32\lib\user32.lib
    86. includelib i:\masm32\lib\kernel32.lib
    87. includelib i:\masm32\lib\gdi32.lib
    88. ;====================================================
    89. ; структуры
    90. ;====================================================
    91. ;
    92. ;--------------------
    93. ; структура сообщения
    94. ;--------------------
    95. ;MSGSTRUCT STRUC
    96. ;     MSHWND        DD   ? ; идентификатор окна,
    97. ;                          ; получающего сообщение
    98. ;     MSMESSAGE     DD   ? ; идентификатор сообщения
    99. ;     MSWPARAM      DD   ? ; доп. информация о сообщении
    100. ;     MSLPARAM      DD   ? ; доп. информация о сообщении
    101. ;     MSTIME        DD   ? ; время посылки сообщения
    102. ;     MSPT          DD   ? ; положение курсора, во время посылки
    103. ;                          ; сообщения
    104. ;MSGSTRUCT ENDS
    105.  
    106. ;--------------------
    107. ; структура окна
    108. ;--------------------
    109. WNDCLASS STRUC
    110.      CLSSTYLE      DD   ? ; стиль окна
    111.      CLWNDPROC     DD   ? ; указатель на процедуру окна
    112.      CLSCSEXTRA    DD   ? ; информация о доп. байтах для
    113.                           ; данной структуры
    114.      CLWNDEXTRA    DD   ? ; информация о доп. байтах для окна
    115.      CLSHINSTANCE  DD   ? ; дескриптор приложения
    116.      CLSHICON      DD   ? ; идентификатор иконы окна
    117.      CLSHCURSOR    DD   ? ; идентификатор курсора окна
    118.      CLBKGROUND    DD   ? ; идентификатор кисти окна
    119.      CLMENUNAME    DD   ? ; имя-идентификатор меню
    120.      CLNAME        DD   ? ; специфицирует имя класса окон
    121. WNDCLASS ENDS
    122.  
    123. ;--------------------
    124. ; структура шрифта
    125. ;--------------------
    126. LOGFONTA STRUCT
    127.   lfHeight          DWORD      ?
    128.   lfWidth           DWORD      ?
    129.   lfEscapement      DWORD      ?
    130.   lfOrientation     DWORD      ?
    131.   lfWeight          DWORD      ?
    132.   lfItalic          BYTE       ?
    133.   lfUnderline       BYTE       ?
    134.   lfStrikeOut       BYTE       ?
    135.   lfCharSet         BYTE       ?
    136.   lfOutPrecision    BYTE       ?
    137.   lfClipPrecision   BYTE       ?
    138.   lfQuality         BYTE       ?
    139.   lfPitchAndFamily  BYTE       ?
    140.   lfFaceName        BYTE       'MS Sans Serif',0
    141. LOGFONTA ENDS
    142.  
    143. ;====================================================
    144. ; сегмент данных
    145. ;====================================================
    146. _DATA SEGMENT      DWORD PUBLIC USE32 'DATA'
    147.      NEWHWND       DD 0    
    148.   ;  MSG           MSGSTRUCT <?>
    149.      WC            WNDCLASS  <?>
    150.      LG            LOGFONTA  <?>
    151.      HINST         DD 0 ; здесь хранится дескриптор приложения
    152.      TITLENAME     DB 'WinZip 9.0 SR-1 KeyGen',0
    153.      CLASSNAME     DB 'CLASS32',0
    154.      CPBUT         DB 'Generate',0 ; выход
    155.      CPEDT         DB ?
    156.      CPSTAT        DB 'Created by Morskoivolk ',0
    157.      CPSTAT1       DB 'Enter name:',0
    158.      CPSTAT2       DB 'Serial number:',0
    159.      CLSBUTN       DB 'BUTTON',0
    160.      CLSEDIT       DB 'EDIT',0
    161.      CLSSTAT       DB 'STATIC',0   
    162.      HWNDBTN       DWORD 0
    163.      HWNDEDT       DWORD 0
    164.      HWNDEDT1      DWORD 0
    165.      HWNDSTAT      DWORD 0
    166.      HWFONT        DWORD 0
    167.      HWFONT1     DWORD 0
    168.      W             DWORD 0
    169.      H             DWORD 0
    170.      X             DWORD 0
    171.      Y             DWORD 0
    172.      el_width      DWORD 0
    173.      Name_length   DWORD 0
    174.      str1          DB 'Внимание!!!',0
    175.      str2          DB 'Введите имя',0
    176.      str3          DB 'Минимальная длина имени - 6 символов',0    
    177.  
    178. _DATA ENDS
    179.  
    180. ;====================================================
    181. ; сегмент кода
    182. ;====================================================
    183. _TEXT SEGMENT DWORD PUBLIC USE32 'CODE'
    184. START:
    185. ; получить дескриптор приложения
    186.      PUSH     0
    187.      CALL     GetModuleHandleA@4
    188.      MOV      [HINST], EAX
    189. REG_CLASS:
    190. ; заполнить структуру окна стиль
    191.      MOV [WC.CLSSTYLE], style
    192. ; процедура обработки сообщений
    193.      MOV [WC.CLWNDPROC], OFFSET WNDPROC
    194.      MOV [WC.CLSCSEXTRA], 0
    195.      MOV [WC.CLWNDEXTRA], 0
    196.      MOV EAX, [HINST]
    197.      MOV [WC.CLSHINSTANCE], EAX
    198. ;--------- иконка окна
    199.      PUSH 1
    200.      PUSH [HINST]
    201.      CALL LoadIconA@8
    202.      MOV  [WC.CLSHICON], EAX
    203. ;---------- курсор окна
    204.      PUSH IDC_ARROW
    205.      PUSH 0
    206.      CALL LoadCursorA@8
    207.      MOV  [WC.CLSHCURSOR], EAX
    208. ;---------
    209.      MOV  [WC.CLBKGROUND], COLOR_BTNFACE+1 ; цвет окна
    210.      MOV DWORD PTR [WC.CLMENUNAME], 0
    211.      MOV DWORD PTR [WC.CLNAME], OFFSET CLASSNAME
    212.      PUSH OFFSET WC
    213.      CALL RegisterClassA@4
    214.  
    215. ;Расположение окна приложения в центре экрана
    216.      mov W,190
    217.      mov H,195
    218.      
    219.      push SM_CXSCREEN
    220.      call GetSystemMetrics@4
    221.      PUSH EAX
    222.      PUSH W
    223.      call TOPXY    
    224.      mov X,eax
    225.  
    226.      push SM_CYSCREEN
    227.      call GetSystemMetrics@4
    228.      PUSH EAX
    229.      PUSH W
    230.      call TOPXY    
    231.      mov Y,eax
    232. ; создать окно зарегистрированного класса
    233.      PUSH 0
    234.      PUSH [HINST]
    235.      PUSH 0
    236.      PUSH 0
    237.      PUSH H ; DY — высота окна
    238.      PUSH W ; DX - ширина окна
    239.      PUSH Y ; Y — координата левого верхнего угла
    240.      PUSH X ; X — координата левого верхнего угла
    241.      PUSH OFFSET WINDOWSTYLE
    242.      PUSH OFFSET TITLENAME ; имя окна
    243.      PUSH OFFSET CLASSNAME ; имя класса
    244.      PUSH 0
    245.      CALL CreateWindowExA@48
    246. ; проверка на ошибку
    247.      ;CMP EAX, 0
    248.      ;JZ  _ERR
    249.      MOV [NEWHWND], EAX ; дескриптор окна
    250. ; --------------------------------------------------
    251.      PUSH SW_SHOWNORMAL
    252.      PUSH [NEWHWND]
    253.      CALL ShowWindow@8; показать созданное окно
    254. ; --------------------------------------------------
    255.      PUSH [NEWHWND]
    256.      CALL UpdateWindow@4  ; команда перерисовать видимую
    257.                           ; часть окна, сообщение WM_PAINT
    258. ; петля обработки сообщений
    259.  
    260.  
    261.  
    262. call BeginMessageLoop
    263.  
    264.  
    265. ;MSG_LOOP:
    266.  ;   PUSH 0
    267.  ;   PUSH 0
    268.  ;   PUSH 0
    269.  ;   PUSH offset MSG
    270.  ;   CALL GetMessageA@16
    271.  ;   CMP EAX, 0
    272.  ;   JE  END_LOOP
    273.  ;   PUSH offset MSG
    274.  ;   CALL TranslateMessage@4
    275.  ;   PUSH offset MSG
    276.  ;   CALL DispatchMessageA@4
    277.  ;   JMP MSG_LOOP
    278. ; END_LOOP:
    279. ; выход из программы (закрыть процесс)
    280. ;     PUSH [MSG.MSWPARAM]
    281. ;     CALL ExitProcess@4
    282. ;_ERR:
    283. ;     JMP END_LOOP
    284.  
    285.  
    286.  
    287.  
    288.  
    289. ; --------------------------------------------------
    290. ;WndProc          proc uses ebx edi esi, hwnd:DWORD, wmsg:DWORD, wparam:DWORD, lparam:DWORD
    291. ;
    292. ; WARNING: Win32 requires that EBX, EDI, and ESI be preserved!  We comply
    293. ; with this by listing those regs after the 'uses' statement in the 'proc'
    294. ; line.  This allows the Assembler to save them for us.
    295. ; процедура окна
    296. ; расположение параметров в стеке
    297. ; [EBP+014H] LPARAM
    298. ; [EBP+10H] WAPARAM
    299. ; [EBP+0CH] MES
    300. ; [EBP+8] HWND
    301. WNDPROC  PROC
    302.  
    303.      
    304. PUSH EBP
    305.      MOV EBP, ESP
    306.      PUSH EBX
    307.      PUSH ESI
    308.      PUSH EDI
    309.      CMP DWORD PTR [EBP+0CH], WM_DESTROY
    310.      JE  WMDESTROY
    311.      CMP DWORD PTR [EBP+0CH], WM_CREATE
    312.      JE  WMCREATE
    313.      CMP DWORD PTR [EBP+10H], 100 ;если нажата кнопка 'Generete'
    314.      JE BNCLICKED
    315.  
    316.      JMP DEFWNDPROC
    317. WMCREATE:
    318. ;создание шрифта MS SANS SERIF
    319.      MOV lg.LfHeight,14   ; высота фонта
    320.      MOV lg.LfWidth, 0    ; ширина фонта
    321.      MOV lg.LfEscapement,900 ; ориентация
    322.      MOV lg.LfOrientation, 0 ; вертикальная
    323.      MOV lg.LfWeight,900   ; толщина линий шрифта
    324.      MOV lg.LfItalic, 0    ; курсив
    325.      MOV lg.LfUnderline, 0 ; подчеркивание
    326.      MOV lg.LfStrikeOut, 0 ; перечеркивание
    327.      MOV lg.LfCharSet, 0   ; набор шрифтов
    328.      MOV lg.LfOutPrecision, 0
    329.      MOV lg.LfClipPrecision, 0
    330.      MOV lg.LfQuality,2
    331.      MOV lg.LfPitchAndFamily,0    
    332.      PUSH OFFSET lg
    333.      CALL CreateFontIndirectA@4
    334.      mov HWFONT,EAX
    335.      MOV lg.LfHeight,15   ; высота фонта
    336.      MOV lg.LfWidth, 0    ; ширина фонта
    337.      MOV lg.LfEscapement,900 ; ориентация
    338.      MOV lg.LfOrientation, 0 ; вертикальная
    339.      MOV lg.LfWeight,0   ; толщина линий шрифта
    340.      MOV lg.LfItalic, 0    ; курсив
    341.      MOV lg.LfUnderline, 0 ; подчеркивание
    342.      MOV lg.LfStrikeOut, 0 ; перечеркивание
    343.      MOV lg.LfCharSet, 0   ; набор шрифтов
    344.      MOV lg.LfOutPrecision, 0
    345.      MOV lg.LfClipPrecision, 0
    346.      MOV lg.LfQuality,2
    347.      MOV lg.LfPitchAndFamily,0    
    348.      PUSH OFFSET lg
    349.      CALL CreateFontIndirectA@4
    350.      MOV HWFONT1,EAX
    351. ; создать окно-кнопку
    352.      mov EBX,W
    353.      MOV el_width,160
    354.      PUSH EBX
    355.      PUSH el_width
    356.      call TOPXY    
    357.      SUB EAX,4              ;это чтобы элемент располагался по центру
    358.      mov X,eax
    359.  
    360.      PUSH 0
    361.      PUSH [HINST]
    362.      PUSH 100
    363.      PUSH DWORD PTR [EBP+08H]
    364.      PUSH 24   ; DY
    365.      PUSH el_width       ; DX
    366.      PUSH 125            ; Y
    367.      PUSH X              ; X
    368.      PUSH STYLBTN
    369.      PUSH OFFSET CPBUT   ; имя окна
    370.      PUSH OFFSET CLSBUTN ; имя класса
    371.      PUSH 0
    372.      CALL CreateWindowExA@48
    373.      MOV HWNDBTN, EAX    ; запомнить дескриптор кнопки
    374.      PUSH 0
    375.      PUSH HWFONT1
    376.      PUSH WM_SETFONT
    377.      PUSH HWNDBTN
    378.      CALL SendMessageA@16
    379.  
    380. ; создать компенент типа TStatic
    381.      PUSH 0
    382.      PUSH [HINST]
    383.      PUSH 0
    384.      PUSH DWORD PTR [EBP+08H]
    385.      PUSH 20   ; DY
    386.      PUSH 160  ; DX
    387.      PUSH 150   ; Y
    388.      PUSH 20   ; X
    389.      PUSH STYLSTAT
    390.      PUSH OFFSET  CPSTAT   ; имя окна
    391.      PUSH OFFSET CLSSTAT ; имя класса
    392.      PUSH 0
    393.      CALL CreateWindowExA@48
    394.      MOV  HWNDSTAT,EAX
    395.      PUSH 0
    396.      PUSH HWFONT1
    397.      PUSH WM_SETFONT
    398.      PUSH HWNDSTAT
    399.      CALL SendMessageA@16
    400. ;создать компенент типа TStatic_1
    401.      PUSH 0
    402.      PUSH [HINST]
    403.      PUSH 0
    404.      PUSH DWORD PTR [EBP+08H]
    405.      PUSH 20   ; DY
    406.      PUSH 160  ; DX
    407.      PUSH 2   ; Y
    408.      PUSH 7   ; X
    409.      PUSH STYLSTAT
    410.      PUSH OFFSET  CPSTAT1   ; имя окна
    411.      PUSH OFFSET CLSSTAT ; имя класса
    412.      PUSH 0
    413.      CALL CreateWindowExA@48
    414.      MOV HWNDSTAT,EAX
    415.      PUSH 0
    416.      PUSH HWFONT
    417.      PUSH WM_SETFONT
    418.      PUSH HWNDSTAT
    419.      CALL SendMessageA@16
    420.  
    421. ;создать компенент типа TStatic_2
    422.      PUSH 0
    423.      PUSH [HINST]
    424.      PUSH 0
    425.      PUSH DWORD PTR [EBP+08H]
    426.      PUSH 20   ; DY
    427.      PUSH 160  ; DX
    428.      PUSH 47   ; Y
    429.      PUSH 7   ; X
    430.      PUSH STYLSTAT
    431.      PUSH OFFSET  CPSTAT2   ; имя окна
    432.      PUSH OFFSET CLSSTAT ; имя класса
    433.      PUSH 0
    434.      CALL CreateWindowExA@48
    435.      MOV HWNDSTAT,EAX
    436.      PUSH 0
    437.      PUSH HWFONT
    438.      PUSH WM_SETFONT
    439.      PUSH HWNDSTAT
    440.      CALL SendMessageA@16
    441.  
    442. ; создать окно редактирования_1
    443.      mov EBX,W
    444.      MOV el_width,160
    445.      PUSH EBX
    446.      PUSH el_width
    447.      call TOPXY    
    448.      SUB EAX,4    
    449.      mov X,eax
    450.  
    451.      PUSH 0
    452.      PUSH [HINST]
    453.      PUSH 0
    454.      PUSH DWORD PTR [EBP+08H]
    455.      PUSH 23   ; DY
    456.      PUSH el_width ; DX
    457.      PUSH 20   ; Y
    458.      PUSH X   ; X
    459.      PUSH STYLEDT
    460.      PUSH OFFSET CPEDT   ; имя окна
    461.      PUSH OFFSET CLSEDIT ; имя класса
    462.      PUSH WS_EX_CLIENTEDGE  
    463.      CALL CreateWindowExA@48
    464.      MOV HWNDEDT,EAX
    465.      PUSH 0
    466.      PUSH HWFONT1
    467.      PUSH WM_SETFONT
    468.      PUSH HWNDEDT
    469.      CALL SendMessageA@16
    470.  
    471. ;--------- установить фокус на окне редактирования
    472.      PUSH HWNDEDT
    473.      CALL SetFocus@4
    474. ; создать окно редактирования_2
    475.      mov EBX,W
    476.      MOV el_width,160
    477.      PUSH EBX
    478.      PUSH el_width
    479.      call TOPXY    
    480.      SUB EAX,4    
    481.      mov X,eax
    482.  
    483.      PUSH 0
    484.      PUSH [HINST]
    485.      PUSH 0
    486.      PUSH DWORD PTR [EBP+08H]
    487.      PUSH 23   ; DY
    488.      PUSH el_width ; DX
    489.      PUSH 65   ; Y
    490.      PUSH X    ; X
    491.      PUSH STYLEDT
    492.      PUSH OFFSET CPEDT   ; имя окна
    493.      PUSH OFFSET CLSEDIT ; имя класса
    494.      PUSH WS_EX_CLIENTEDGE
    495.      CALL CreateWindowExA@48
    496.      MOV HWNDEDT1,EAX
    497.      PUSH 0
    498.      PUSH HWFONT1
    499.      PUSH WM_SETFONT
    500.      PUSH HWNDEDT1
    501.      CALL SendMessageA@16
    502.      MOV EAX, 0
    503.      JMP FINISH
    504.  
    505. DEFWNDPROC:
    506.      PUSH DWORD PTR [EBP+14H]
    507.      PUSH DWORD PTR [EBP+10H]
    508.      PUSH DWORD PTR [EBP+0CH]
    509.      PUSH DWORD PTR [EBP+08H]
    510.      CALL DefWindowProcA@16
    511.      JMP FINISH
    512.  
    513. BNCLICKED:
    514.      PUSH HWNDEDT
    515.      call GetWindowTextLengthA@4 ;считает количество символов во введенном тексте
    516. .if  EAX==0            ;если количество символов 0, то  
    517.      call EnterName    ;вывод сообщения....
    518. .elseif EAX<6          ;если количество символов < 6, то
    519.      call MinLength    ;вывод сообщения....
    520. .endif
    521.      JMP FINISH
    522.  
    523. WMDESTROY:
    524.      PUSH 0
    525.      CALL PostQuitMessage@4 ; сообщение WM_QUIT
    526.      MOV EAX, 0
    527.  
    528. FINISH:
    529.      POP EDI
    530.      POP ESI
    531.      POP EBX
    532.      POP EBP
    533.      RET 16
    534. WNDPROC ENDP
    535.  
    536. ;------------------------------------------------------------
    537. TopXY proc wDim:DWORD, sDim:DWORD ;процедура,центрирующая окно приложения
    538.      shr sDim,1
    539.      shr wDim,1
    540.      mov eax,wDim
    541.      sub sDim,eax
    542.      mov eax,SDim
    543.      ret
    544. TopXY endp
    545. ;===========================================================
    546. ;процедуры вывода сообщения о некорректном вводе информации
    547. ;===========================================================
    548. EnterName proc  
    549.      push 0
    550.      push offset str1
    551.      push offset str2
    552.      push NEWHWND
    553.      call MessageBoxA@16    
    554.      RET
    555. EnterName endp    
    556.  
    557. MinLength proc    
    558.      push 0
    559.      push offset str1
    560.      push offset str3
    561.      push NEWHWND
    562.      call MessageBoxA@16
    563.      RET
    564. MinLength endp
    565. ;===========================================================
    566.  
    567. BeginMessageLoop proc
    568.    push ebp
    569.    sub  esp, 24
    570.    mov ebp, esp  ; ebp указывает на начало структуры в стеке
    571.  
    572. @@:
    573.    xor eax, eax
    574.    push eax
    575.    push eax
    576.    push eax
    577.    push ebp
    578.    call GetMessageA@16
    579.    test eax, eax
    580.    jz @f
    581.    push ebp
    582.    call TranslateMessage@4
    583.    push ebp
    584.    call DispatchMessageA@4
    585.    jmp @b
    586.  
    587. @@:
    588.    add esp, 24
    589.    pop ebp
    590.    ret
    591. BeginMessageLoop endp
    592.  
    593.  
    594. _TEXT ENDS
    595. END START