В чем тут проблема? *NOOB*

Тема в разделе "WASM.BEGINNERS", создана пользователем PUSH, 28 фев 2009.

  1. PUSH

    PUSH New Member

    Публикаций:
    0
    Регистрация:
    4 авг 2008
    Сообщения:
    25
    Взялся курить исходники Mikl_-а для FASM, но понял, что для меня такое пока рановато... :dntknw:
    Не въезжаю, приученный к высокоуровневым высказываниям, в простоту ассемблера. :dntknw:(
    Итак...

    Код (Text):
    1. format PE GUI
    2. entry start
    3. include 'win32ax.inc'
    4. ; import data in the same section
    5.  
    6. proc Win
    7.       pop [w]
    8.       pop [h]
    9.       xchg ebx,eax
    10.       mov edi,wTitle
    11.       mov esi,400000h
    12.       ; +------------------------------+
    13.       ; | registering the window class |
    14.       ; +------------------------------+
    15.       invoke RegisterClass,esp,ebx,WindowProc,ebx,\
    16.       ebx,esi,ebx,10011h,COLOR_WINDOW,ebx,edi
    17.       push ebx
    18.       push esi
    19.       push ebx
    20.       push ebx
    21.       push [h];WinH
    22.       push [w];WinW
    23.       invoke GetSystemMetrics,SM_CYSCREEN
    24.       sub eax,352
    25.       shr eax,1
    26.       push eax
    27.       invoke GetSystemMetrics,SM_CXSCREEN
    28.       sub eax,512
    29.       shr eax,1
    30.       ; +--------------------------+
    31.       ; | creating the main window |
    32.       ; +--------------------------+
    33.       invoke CreateWindowEx,ebx,edi,edi,WS_OVERLAPPEDWINDOW+WS_VISIBLE,eax
    34.      
    35.       mov ebp,esp
    36.     ret
    37. endp
    38.  
    39. start:
    40.     push 100
    41.     push 352
    42.     call Win
    43.     invoke  MessageBox,NULL,wTitle,NULL,MB_ICONERROR+MB_OK
    44.       ; +---------------------------+
    45.       ; | entering the message loop |
    46.       ; +---------------------------+
    47. message_loop: invoke GetMessage,ebp,ebx,ebx,ebx
    48.       invoke DispatchMessage,ebp
    49.       jmp message_loop
    50.       ; +----------------------+
    51.       ; | the window procedure |
    52.       ; +----------------------+
    53.  
    54.  
    55. proc WindowProc hwnd,wmsg,wparam,lparam
    56.  
    57.     push    ebx esi edi
    58.     cmp [wmsg],WM_DESTROY
    59.     je  .wmdestroy
    60.   .defwndproc:
    61.     invoke  DefWindowProc,[hwnd],[wmsg],[wparam],[lparam]
    62.     jmp .finish
    63.   .wmdestroy:
    64.     invoke  PostQuitMessage,0
    65.     xor eax,eax
    66.     invoke  ExitProcess,0
    67.   .finish:
    68.     pop edi esi ebx
    69.     ret
    70. endp
    71.  
    72.       wTitle db   'Окошко',0 ;name of our window
    73.       w dd ?
    74.       h dd ?
    75. data import
    76.  
    77.  library KERNEL32, 'KERNEL32.DLL',\
    78.      user32,   'USER32.DLL'
    79.  import KERNEL32,\
    80.            ExitProcess,    'ExitProcess'
    81.  import user32,\
    82.         PostQuitMessage,        'PostQuitMessage',\
    83.         RegisterClass,      'RegisterClassA',\
    84.         CreateWindowEx,     'CreateWindowExA',\
    85.         DefWindowProc,      'DefWindowProcA',\
    86.         GetMessage,     'GetMessageA',\
    87.         DispatchMessage,    'DispatchMessageA',\
    88.         MessageBox,    'MessageBoxA',\
    89.         GetSystemMetrics,   'GetSystemMetrics'
    90. end data
    Никак не въеду, почему окошко вдруг исчезает. *тупой* :dntknw:
     
  2. PUSH

    PUSH New Member

    Публикаций:
    0
    Регистрация:
    4 авг 2008
    Сообщения:
    25
    И еще... Как описать и использовать процедуру с несколькими аргументами разного типа???
    Код (Text):
    1. proc WinCreationProcedure CallBack:DWORD,Title:BYTE,BlaBla:BYTE
    2. ...
    3. mov edi,[Title]
    4. invoke RegisterClass,esp,ebx,[CallBack],ebx,ebx,esi,ebx,10011h,COLOR_WINDOW,ebx,edi
    5. ...
    6. ret
    7. endp
    8. ...
    9. stdcall [i](или invoke)[/i] Procedure,MyCallBackProc,MyTitle,MyBlaBla
    10. ...
    11. proc MyCallBackProc hwnd,wmsg,wparam,lparam
    12. ...
    13. ret
    14. endp
    15. ...
    16. MyTitle db 'Заголовок',0
    Такое НЕ работает... :dntknw:(
     
  3. lold

    lold New Member

    Публикаций:
    0
    Регистрация:
    24 фев 2009
    Сообщения:
    4
    proc myproc,param1,abc,def,numbeer
    ret
    endp


    под x86 выравнивание лучше делать 4 байта,тоесть dword а не байты а в самой процедуре либо movzx/movsx либо and 0fff...
     
  4. PUSH

    PUSH New Member

    Публикаций:
    0
    Регистрация:
    4 авг 2008
    Сообщения:
    25
    То есть все аргументы "типа как" по 4 байта, а потом ИЗ них "доставать" значения?
     
  5. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Верно. Грузишь параметр в EAX и используешь AL (BYTE) или AX (WORD). Особого кода "доставания" нет.
     
  6. PUSH

    PUSH New Member

    Публикаций:
    0
    Регистрация:
    4 авг 2008
    Сообщения:
    25
    Код (Text):
    1. format PE GUI
    2. entry start
    3. include 'win32ax.inc'
    4. ; import data in the same section
    5.  
    6. proc Win
    7.       pop [w]
    8.       pop [h]
    9.       xchg ebx,eax
    10.       mov edi,wTitle
    11.       mov esi,400000h
    12.       ; +------------------------------+
    13.       ; | registering the window class |
    14.       ; +------------------------------+
    15.       invoke RegisterClass,esp,ebx,WindowProc,ebx,\
    16.       ebx,esi,ebx,10011h,COLOR_WINDOW,ebx,edi
    17.       push ebx
    18.       push esi
    19.       push ebx
    20.       push ebx
    21.       push [h];WinH
    22.       push [w];WinW
    23.       invoke GetSystemMetrics,SM_CYSCREEN
    24.       sub eax,352
    25.       shr eax,1
    26.       push eax
    27.       invoke GetSystemMetrics,SM_CXSCREEN
    28.       sub eax,512
    29.       shr eax,1
    30.       ; +--------------------------+
    31.       ; | creating the main window |
    32.       ; +--------------------------+
    33.       invoke CreateWindowEx,ebx,edi,edi,WS_OVERLAPPEDWINDOW+WS_VISIBLE,eax
    34.      
    35.       mov ebp,esp
    36.     ret
    37. endp
    38.  
    39. start:
    40.     push 100
    41.     push 352
    42.     call Win
    43.     invoke  MessageBox,NULL,wTitle,NULL,MB_ICONERROR+MB_OK
    44.       ; +---------------------------+
    45.       ; | entering the message loop |
    46.       ; +---------------------------+
    47. message_loop: invoke GetMessage,ebp,ebx,ebx,ebx
    48.       invoke DispatchMessage,ebp
    49.       jmp message_loop
    50.       ; +----------------------+
    51.       ; | the window procedure |
    52.       ; +----------------------+
    53.  
    54.  
    55. proc WindowProc hwnd,wmsg,wparam,lparam
    56.  
    57.     push    ebx esi edi
    58.     cmp [wmsg],WM_DESTROY
    59.     je  .wmdestroy
    60.   .defwndproc:
    61.     invoke  DefWindowProc,[hwnd],[wmsg],[wparam],[lparam]
    62.     jmp .finish
    63.   .wmdestroy:
    64.     invoke  PostQuitMessage,0
    65.     xor eax,eax
    66.     invoke  ExitProcess,0
    67.   .finish:
    68.     pop edi esi ebx
    69.     ret
    70. endp
    71.  
    72.       wTitle db   'Окошко',0 ;name of our window
    73.       w dd ?
    74.       h dd ?
    75. data import
    76.  
    77.  library KERNEL32, 'KERNEL32.DLL',\
    78.      user32,   'USER32.DLL'
    79.  import KERNEL32,\
    80.            ExitProcess,    'ExitProcess'
    81.  import user32,\
    82.         PostQuitMessage,        'PostQuitMessage',\
    83.         RegisterClass,      'RegisterClassA',\
    84.         CreateWindowEx,     'CreateWindowExA',\
    85.         DefWindowProc,      'DefWindowProcA',\
    86.         GetMessage,     'GetMessageA',\
    87.         DispatchMessage,    'DispatchMessageA',\
    88.         MessageBox,    'MessageBoxA',\
    89.         GetSystemMetrics,   'GetSystemMetrics'
    90. end data
    НАРОД! В чем тут проблема (кроме кривоты моих рук, конечно :) )???
    Почему окошко исчезает только появившись? Спасите нуба - дайте ответ *PLZ*
     
  7. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    В поставке FASM есть директория EXAMPLES\TEMPLATE. Сравни код.

    1. Сколько параметров в CreateWindowEx()?
    2. Как сделан Message Loop?
    3. Где вызвана ExitProcess()? Внутри процедуры окна или нет?

    И ещё (на примере кода):
    Код (Text):
    1. mov        eax, esp
    2. invoke    Procedure1, esp, ebx, esi, edi
    вопрос: ESP который PUSH-ается первым параметром - равен ли он EAX перед вызовом 'Procedure1'? (Ответ: не равен.)
     
  8. PUSH

    PUSH New Member

    Публикаций:
    0
    Регистрация:
    4 авг 2008
    Сообщения:
    25
    Если честно, ни хрена не понял.
    Если может только
    , не пойму, правда какой его части... :dntknw:
    А так
    Код (Text):
    1. mov        eax, esp
    2. invoke    Procedure1, esp, ebx, esi, edi
    выглядит как "Сохранили в EAX значение ESP (количество байтов в стеке, насколько я знаю) перед вызовом процедуры и вызвали саму процедуру, передавая ей первым аргументом, зачем, не знаю (вроде invoke-макрос сам делает это), наше количество байтов в стеке (ESP)... А причем же здесь равно-не равно??? *NOOB*

    Просто:
    Код (Text):
    1. format PE GUI
    2. include 'win32ax.inc'
    3. ; import data in the same section
    4.  
    5.       xchg ebx,eax
    6.       mov edi,wTitle
    7.       mov esi,400000h
    8.       ; +------------------------------+
    9.       ; | registering the window class |
    10.       ; +------------------------------+
    11.       invoke RegisterClass,esp,ebx,window_procedure,ebx,\
    12.       ebx,esi,ebx,10011h,COLOR_WINDOW+1,ebx,edi
    13.       push ebx
    14.       push esi
    15.       push ebx
    16.       push ebx
    17.       push 352;WinH
    18.       push 512;WinW
    19.       invoke GetSystemMetrics,SM_CYSCREEN
    20.       sub eax,352
    21.       shr eax,1
    22.       push eax
    23.       invoke GetSystemMetrics,SM_CXSCREEN
    24.       sub eax,512
    25.       shr eax,1
    26.       ; +--------------------------+
    27.       ; | creating the main window |
    28.       ; +--------------------------+
    29.       invoke CreateWindowEx,ebx,edi,edi,WS_OVERLAPPEDWINDOW+WS_VISIBLE,eax
    30.       mov ebp,esp
    31.       ; +---------------------------+
    32.       ; | entering the message loop |
    33.       ; +---------------------------+
    34. message_loop: invoke GetMessage,ebp,ebx,ebx,ebx
    35.       invoke DispatchMessage,ebp
    36.       jmp message_loop
    37.       ; +----------------------+
    38.       ; | the window procedure |
    39.       ; +----------------------+
    40. window_procedure: cmp dword[esp+0x08],WM_DESTROY
    41.            je wmDESTROY
    42.            jmp dword [DefWindowProc]
    43. wmDESTROY: invoke ExitProcess,ebx
    44.       wTitle db   'Iczelion Tutorial #3:A Simple Window in centre in FASM',0 ;name of our window
    45. data import
    46.  
    47.  library KERNEL32, 'KERNEL32.DLL',\
    48.      user32,   'USER32.DLL'
    49.  import KERNEL32,\
    50.            ExitProcess,    'ExitProcess'
    51.  import user32,\
    52.         RegisterClass,      'RegisterClassA',\
    53.         CreateWindowEx,     'CreateWindowExA',\
    54.         DefWindowProc,      'DefWindowProcA',\
    55.         GetMessage,     'GetMessageA',\
    56.         DispatchMessage,    'DispatchMessageA',\
    57.         GetSystemMetrics,   'GetSystemMetrics'
    58. end data
    - Рабочий код ( (С) Mikl_ ). Я в коде первого поста только закинул процедуры инициализации окна в отдельную процедуру с возможностью указывать высоту и ширину окна не в параметрах процедур инициализации (что я мелю... :) Надеюсь все читаемо). И теперь окошко появляется и исчезает сразу. Причем в процедуру WindowProc ПОСЫЛАЮТСЯ СООБЩЕНИЯ. Но после создания окна процедурой Win процесс не возвращается в основной код, ведь
    Код (Text):
    1. invoke  MessageBox,NULL,wTitle,NULL,MB_ICONERROR+MB_OK
    не вызывается. Это и есть мое ПОЧЕМУ.
    P.S. Мое нубское чутье подсказывает, что проблемы неправильном обращении со стеком, но в чем же проблема, мне никак не дойти :dntknw:( *HELP*
     
  9. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    PUSH
    Очень даже правильно подсказывает. Вообще стоило сначала глянуть в Olly. В самом начале у Вас исполняется код:
    Код (Text):
    1. push 100
    2. push 352
    3. call Win
    Сколько двойных слов положено в стек? А вот и неправильно. Три: 100, 352 и адрес возврата. Внутри процедуры:
    Код (Text):
    1. pop [w]
    2. pop [h]
    Что снимается с вершины стека? Именно. Снимается адрес возврата и 352. Значит куда попадёт управление после ret'а? Правильно. На Луну.
    И к тому же перед ret'ом не стоит делать mov ebp,esp, т.к. стек по полученному здесь в ebp адресу в дальнейшем будет использоваться, как буфер для структуры MSG. Т.е. возвращаемая структура будет перекрываться с передаваемым внутрь функций параметром. А это может быть чревато.
     
  10. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Этот код немного с трюками, например, нет использования структур, а просто поля структуры идут в стек и затем ESP идёт как адрес структуры - красиво, но читать такой код трудновато. Я бы посоветовал учиться на более удобоваримом коде - например из поставки FASM.

    Почему окно исчезает - не понятно.

    P.S. RegisterClass() чистит за собой 4 байта (один DWORD параметер), так что попробуй почистить остальное занесённое при этом вызове (размер структуры WNDCLASS). Если этого не сделать, то адрес возврата из Win будет не в нужном месте.
     
  11. PUSH

    PUSH New Member

    Публикаций:
    0
    Регистрация:
    4 авг 2008
    Сообщения:
    25
    l_inc
    Метко. *РЖУниМаГУ* Запатентуй. :))

    Код (Text):
    1. format PE GUI
    2. entry start
    3. include 'win32ax.inc'
    4. ; import data in the same section
    5.  
    6. proc Win
    7.       pop [adr]
    8.       pop [w]
    9.       pop [h]
    10.       xchg ebx,eax
    11.       mov edi,wTitle
    12.       mov esi,400000h
    13.       ; +------------------------------+
    14.       ; | registering the window class |
    15.       ; +------------------------------+
    16.       invoke RegisterClass,esp,ebx,WindowProc,ebx,\
    17.       ebx,esi,ebx,10011h,COLOR_WINDOW,ebx,edi
    18.       push ebx
    19.       push esi
    20.       push ebx
    21.       push ebx
    22.       push [h];WinH
    23.       push [w];WinW
    24.       invoke GetSystemMetrics,SM_CYSCREEN
    25.       sub eax,352
    26.       shr eax,1
    27.       push eax
    28.       invoke GetSystemMetrics,SM_CXSCREEN
    29.       sub eax,512
    30.       shr eax,1
    31.       ; +--------------------------+
    32.       ; | creating the main window |
    33.       ; +--------------------------+
    34.       invoke CreateWindowEx,ebx,edi,edi,WS_OVERLAPPEDWINDOW+WS_VISIBLE,eax
    35.       mov ebp,esp
    36.       push [adr]
    37.     ret
    38. endp
    39.  
    40. start:
    41.     push 100
    42.     push 352
    43.     call Win
    44.     invoke  MessageBox,NULL,wTitle,NULL,MB_ICONERROR+MB_OK
    45.       ; +---------------------------+
    46.       ; | entering the message loop |
    47.       ; +---------------------------+
    48. message_loop: invoke GetMessage,ebp,ebx,ebx,ebx
    49.       invoke DispatchMessage,ebp
    50.       jmp message_loop
    51.       ; +----------------------+
    52.       ; | the window procedure |
    53.       ; +----------------------+
    54.  
    55.  
    56. proc WindowProc hwnd,wmsg,wparam,lparam
    57.     ;invoke MessageBox,NULL,wTitle,NULL,MB_ICONERROR+MB_OK
    58.     push    ebx esi edi
    59.     cmp [wmsg],WM_DESTROY
    60.     je  .wmdestroy
    61.   .defwndproc:
    62.     invoke  DefWindowProc,[hwnd],[wmsg],[wparam],[lparam]
    63.     jmp .finish
    64.   .wmdestroy:
    65.     invoke  PostQuitMessage,0
    66.     xor eax,eax
    67.     invoke  ExitProcess,0
    68.   .finish:
    69.     pop edi esi ebx
    70.     ret
    71. endp
    72.  
    73.       wTitle db   'Окошко',0 ;name of our window
    74.       w dd ?
    75.       h dd ?
    76.       adr dd ?
    77. data import
    78.  
    79.  library KERNEL32, 'KERNEL32.DLL',\
    80.      user32,   'USER32.DLL'
    81.  import KERNEL32,\
    82.            ExitProcess,    'ExitProcess'
    83.  import user32,\
    84.         PostQuitMessage,        'PostQuitMessage',\
    85.         RegisterClass,      'RegisterClassA',\
    86.         CreateWindowEx,     'CreateWindowExA',\
    87.         DefWindowProc,      'DefWindowProcA',\
    88.         GetMessage,     'GetMessageA',\
    89.         DispatchMessage,    'DispatchMessageA',\
    90.         MessageBox,    'MessageBoxA',\
    91.         GetSystemMetrics,   'GetSystemMetrics'
    92. end data
    ЗАРАБОТАЛО!!! Окно исчезает из-за перенаправления "на луну" (С) l_inc. Я ж и не заметил, что окошко первого поста по ширине уехало аж за экран. Теперь усэ понятно. Сохранили адрес из стека и восстановили его прямо перед ret-ом.
    Но теперь еще вопросы:
    Получается push и pop при работе с памятью требуют адрес, а не значение. Так? Если да, то я НАКОНЕЦ ТО ВКУРИЛ. БУГАГА!!! Всем БОЛЬШОЙ-ПРЕБОЛЬШОЙ СПАСИБ за проявленное терпение. :)
     
  12. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Скачал бы дебаггер и не мучался..
     
  13. PUSH

    PUSH New Member

    Публикаций:
    0
    Регистрация:
    4 авг 2008
    Сообщения:
    25
    Олли мучаю... Кривым рукам деБАГгер не подмога :)
     
  14. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    PUSH
    Почему у тебя такое низкое о себе мнение, кривые руки, нуб.. это приводит к отсутствию самонадеянности..
     
  15. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Clerk
    :) То ли дело у Вас. :) Надо ж сразу попутно давать ссылки на классику. :derisive:
     
  16. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    То кристалег, я это я.)
     
  17. PUSH

    PUSH New Member

    Публикаций:
    0
    Регистрация:
    4 авг 2008
    Сообщения:
    25
    "Нуб" и "Кривые руки" - самотонус к познанию :) ... Типа "аутотренинг через отрицание и все такое". (Фрейд, дружище, где же ты :) ) Короче, сам себя не поругаешь, никто не похвалит (С) PUSH

    CrystalIC
    Надо бы тоже почитать сорцы Винды, доки и посидеть в дизасме, мож тоже стану ЭЛИТОЙ :)
     
  18. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Жесть.. когда я то читал катался по полу от смеха; смысл не в том, я к тому что:
    Под отладчиком ведь всё видно что куда идёт, не то что замечание, просто полезный совет.
     
  19. PUSH

    PUSH New Member

    Публикаций:
    0
    Регистрация:
    4 авг 2008
    Сообщения:
    25
    И снова ОНО!

    Теперь вынес процедуру создания окна в отдельную библиотеку и вызвал экспортированную функцию из проги-проверки. Результат в Олли - отправили данные в стек, но достали СОВСЕМ НЕ ТО. Итог - опять лажа. Представляю на ваш суд совмещенный РАБОЧИЙ код:
    Код (Text):
    1. format PE GUI
    2. entry start
    3. include 'win32a.inc'
    4. ; import data in the same section
    5.  
    6. proc Win
    7.       pop [adr]
    8.       pop [t]
    9.       pop [CB]
    10.       pop [w]
    11.       pop [h]
    12.       xchg ebx,eax
    13.       mov edi,[t]
    14.       mov esi,400000h
    15.       ; +------------------------------+
    16.       ; | registering the window class |
    17.       ; +------------------------------+
    18.       invoke RegisterClass,esp,ebx,[CB],ebx,\
    19.       ebx,esi,ebx,10011h,COLOR_WINDOW,ebx,edi
    20.       push ebx
    21.       push esi
    22.       push ebx
    23.       push ebx
    24.       push [h];WinH
    25.       push [w];WinW
    26.       invoke GetSystemMetrics,SM_CYSCREEN
    27.       sub eax,352
    28.       shr eax,1
    29.       push eax
    30.       invoke GetSystemMetrics,SM_CXSCREEN
    31.       sub eax,512
    32.       shr eax,1
    33.       ; +--------------------------+
    34.       ; | creating the main window |
    35.       ; +--------------------------+
    36.       invoke CreateWindowEx,ebx,edi,edi,WS_OVERLAPPEDWINDOW+WS_VISIBLE,eax
    37.       mov ebp,esp
    38.       push [adr]
    39.     ret
    40. endp
    41.  
    42. start:
    43.     stdcall Win,wTitle,WindowProc,352,100
    44.       ; +---------------------------+
    45.       ; | entering the message loop |
    46.       ; +---------------------------+
    47.      
    48. message_loop: invoke GetMessage,ebp,ebx,ebx,ebx
    49.       mov eax,99
    50.       ;mov ebx,2
    51.       mov edx,56
    52.       invoke DispatchMessage,ebp
    53.       jmp message_loop
    54.       ; +----------------------+
    55.       ; | the window procedure |
    56.       ; +----------------------+
    57.  
    58.  
    59. proc WindowProc hwnd,wmsg,wparam,lparam
    60.     ;invoke MessageBox,NULL,wTitle,NULL,MB_ICONERROR+MB_OK
    61.     push    ebx esi edi
    62.     cmp [wmsg],WM_DESTROY
    63.     je  .wmdestroy
    64.   .defwndproc:
    65.     invoke  DefWindowProc,[hwnd],[wmsg],[wparam],[lparam]
    66.     jmp .finish
    67.   .wmdestroy:
    68.     invoke  PostQuitMessage,0
    69.     xor eax,eax
    70.     invoke  ExitProcess,0
    71.   .finish:
    72.     pop edi esi ebx
    73.     ret
    74. endp
    75.  
    76.       wTitle db   'Окошко',0 ;name of our window
    77.       t dd ?
    78.       w dd ?
    79.       h dd ?
    80.       CB dd ?
    81.       adr dd ?
    82. data import
    83.  
    84.  library KERNEL32, 'KERNEL32.DLL',\
    85.      user32,   'USER32.DLL'
    86.  import KERNEL32,\
    87.            ExitProcess,    'ExitProcess'
    88.  import user32,\
    89.         PostQuitMessage,        'PostQuitMessage',\
    90.         RegisterClass,      'RegisterClassA',\
    91.         CreateWindowEx,     'CreateWindowExA',\
    92.         DefWindowProc,      'DefWindowProcA',\
    93.         GetMessage,     'GetMessageA',\
    94.         DispatchMessage,    'DispatchMessageA',\
    95.         MessageBox,    'MessageBoxA',\
    96.         GetSystemMetrics,   'GetSystemMetrics'
    97. end data
    и два РАЗДЕЛЕННЫХ, проблема, как мне кажется в коде БИБЛИОТЕКИ:

    Код (Text):
    1. format PE GUI 4.0 DLL
    2. entry DllEntryPoint
    3. include 'win32a.inc'
    4. ; import data in the same section
    5.  
    6. proc DllEntryPoint hinstDLL,fdwReason,lpvReserved
    7.     mov eax,TRUE
    8.     ret
    9. endp
    10.  
    11. proc Win,t,CB,w,h
    12.       ;pop [adr]
    13.       ;pop [t]
    14.       ;pop [CB]
    15.       ;pop [w]
    16.       ;pop [h]
    17.       xchg ebx,eax
    18.       mov edi,[t]
    19.       mov esi,400000h
    20.       ; +------------------------------+
    21.       ; | registering the window class |
    22.       ; +------------------------------+
    23.       invoke RegisterClass,esp,ebx,[CB],ebx,\
    24.       ebx,esi,ebx,10011h,COLOR_WINDOW,ebx,edi
    25.       push ebx
    26.       push esi
    27.       push ebx
    28.       push ebx
    29.       push [h];WinH
    30.       push [w];WinW
    31.       invoke GetSystemMetrics,SM_CYSCREEN
    32.       sub eax,352
    33.       shr eax,1
    34.       push eax
    35.       invoke GetSystemMetrics,SM_CXSCREEN
    36.       sub eax,512
    37.       shr eax,1
    38.       ; +--------------------------+
    39.       ; | creating the main window |
    40.       ; +--------------------------+
    41.       invoke CreateWindowEx,ebx,edi,edi,WS_OVERLAPPEDWINDOW+WS_VISIBLE,eax
    42.       mov ebp,esp
    43.       push [adr]
    44.     ret
    45. endp
    46.  
    47.       t dd ?
    48.       w dd ?
    49.       h dd ?
    50.       CB dd ?
    51.       adr dd ?
    52.  
    53. data import
    54.  library KERNEL32, 'KERNEL32.DLL',\
    55.      user32,   'USER32.DLL'
    56.  import KERNEL32,\
    57.            ExitProcess,    'ExitProcess'
    58.  import user32,\
    59.         PostQuitMessage,        'PostQuitMessage',\
    60.         RegisterClass,      'RegisterClassA',\
    61.         CreateWindowEx,     'CreateWindowExA',\
    62.         DefWindowProc,      'DefWindowProcA',\
    63.         GetMessage,     'GetMessageA',\
    64.         DispatchMessage,    'DispatchMessageA',\
    65.         MessageBox,    'MessageBoxA',\
    66.         GetSystemMetrics,   'GetSystemMetrics'
    67. end data
    68.  
    69. section '.edata' export data readable
    70.  
    71.   export 'MM_GUI.DLL',\
    72.      Win,'Win'
    73.      
    74. section '.reloc' fixups data discardable
    Код (Text):
    1. format PE GUI 4.0
    2. entry start
    3.  
    4. include 'win32a.inc'
    5.  
    6. section '.code' code readable executable
    7. proc WindowProc hwnd,wmsg,wparam,lparam
    8.     push    ebx esi edi
    9.     cmp [wmsg],2; 2=WM_DESTROY
    10.     je  .wmdestroy
    11.   .defwndproc:
    12.     invoke  DefWindowProc,[hwnd],[wmsg],[wparam],[lparam]
    13.     jmp .finish
    14.   .wmdestroy:
    15.     invoke  PostQuitMessage,0
    16.     xor eax,eax
    17.     invoke  ExitProcess,0
    18.   .finish:
    19.     pop edi esi ebx
    20.     ret
    21. endp
    22.  
    23.   wTitle db   'Iczelion Tutorial #3:A Simple Window in centre in FASM',0
    24.  
    25.   start:
    26.     invoke  Win,wTitle,WindowProc,352,100
    27.  
    28.   message_loop: invoke GetMessage,ebp,ebx,ebx,ebx
    29.       invoke DispatchMessage,ebp
    30.       jmp message_loop
    31.  
    32. section '.idata' import data readable writeable
    33.  
    34.   library KERNEL32, 'KERNEL32.DLL',\
    35.      user32, 'USER32.DLL',\
    36.      mmgui, 'MM_GUI.DLL'
    37.  import KERNEL32,\
    38.            ExitProcess,    'ExitProcess'
    39.  import user32,\
    40.         PostQuitMessage,        'PostQuitMessage',\
    41.         RegisterClass,      'RegisterClassA',\
    42.         CreateWindowEx,     'CreateWindowExA',\
    43.         DefWindowProc,      'DefWindowProcA',\
    44.         GetMessage,     'GetMessageA',\
    45.         DispatchMessage,    'DispatchMessageA',\
    46.         MessageBox,    'MessageBoxA',\
    47.         GetSystemMetrics,   'GetSystemMetrics'
    48.  
    49.   import mmgui,\
    50.      Win,'Win'
    ПАМАГИТЕ!!! Мой маленький мозг пока это сам осилить не может :dntknw:
     
  20. PUSH

    PUSH New Member

    Публикаций:
    0
    Регистрация:
    4 авг 2008
    Сообщения:
    25
    Поправлюсь. Окошко теперь появляется, но сразу исчезает. Видать опять ошибка с указателями... Думаю.