первое окно

Тема в разделе "WASM.BEGINNERS", создана пользователем goga2007, 12 мар 2007.

  1. goga2007

    goga2007 New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2007
    Сообщения:
    184
    вот смотрю какие вы тут вопросы обсуждаете и стыдно задать свой. написал я эту хрень поль зуясь 3-м уроком икцелиона(но на fasm; а на фасме потому как другие компиляторы на мой комп не встают, или с моими руками...,но не суть).вот такой вот код не принимается фасмом
    Код (Text):
    1. format PE GUI 4.0
    2. entry start
    3.  
    4. include 'C:\program files\tools\fasmw167\include\win32a.inc'
    5. section '.data' data readable writeable
    6.     caption db 'author is cool hacker',0
    7.     text    db 'its coolest programm',0
    8.     mymessage db 'reaction',0
    9.     hinstance dd 0
    10.     mes     db 'its a message',0
    11.     mes2    db  0
    12.     msg    MSG
    13.     wc     WNDCLASS
    14.     mes3    db 0
    15.     hwnd   HWND
    16.     hDC     db 0
    17.     ws      equ WS_VISIBLE+WS_CAPTION+WS_MINIMIZEBOX+WS_SYSMENU
    18.     _class  db 'FCAPTION',0
    19.     hint    db 'indifferently',0
    20.  
    21. section  '.code' code readable executable
    22.  
    23.     start:
    24.       invoke   GetModuleHandle,0
    25.       mov      [wc.hInstance],eax
    26.       mov      [hinstance],eax
    27.       invoke   LoadIcon ,0,IDI_APPLICATION
    28.       mov      [wc.hIcon],eax
    29.       invoke   LoadCursor,0,IDC_ARROW
    30.       mov      [wc.hCursor],eax
    31.       mov      [wc.style],0
    32.       mov      [wc.lpfnWndProc],WindowProc
    33.       mov      [wc.cbClsExtra],0
    34.       mov      [wc.cbWndExtra],0
    35.       mov      [wc.hbrBackground],COLORWINDOW+1
    36.       mov      [wc.lpszMenuName],0
    37.       mov      [wc.lpszClassName],_class
    38.  
    39.       invoke   RegisterClass,wc
    40.       invoke   CreateWindowEx,0,_class,hint,ws,10,10,680,450,NULL,NULL,[hinstance],NULL
    41.       mov      hwnd,eax
    42.       invoke   ShowWindow,hwnd,0
    43.       jmp      mloop
    44.  
    45. mloop:
    46.       invoke   GetMessage,msg,NULL,0,0
    47.       or       eax,eax
    48.       jz       exit
    49.       invoke   TranslateMessage,msg
    50.       invoke   DispatchMessage,msg
    51.       jmp      mloop
    52.  
    53. exit:
    54.       invoke   ExitProcess,[msg.wparam]
    55.  
    56. proc  WindowProc,hwnd,wmsg,wparam,lparam
    57.       enter
    58.       push     ebx esi edi
    59.       cmp      [wmsg],WM_DESTROY
    60.       je       wmdestroy
    61.       invoke   DefWindowProc,[hwnd],[wmsg],[wparam],[lparam]
    62.       pop      edi esi ebx
    63.       ret
    64.  
    65. wmdestroy:
    66.       invoke   PostQuitMessage,0
    67.       xor      eax,eax
    68.       ret
    69.  
    70. endp
    71.  
    72. section '.idata' import data readable writeable
    73.       library  kernel,'KERNEL32.DLL',\
    74.            user,'USER32.DLL'
    75.  
    76.  
    77.       kernel:
    78.           import  GetModuleHandle,'GetModuleHandleA',\
    79.               ExitProcess,'ExitProcess'
    80.  
    81.       user:
    82.          import   RegisterClass,'RegisterClassA',\
    83.               CreateWindowEx,'CreateWindowExA',\
    84.               DefWindowProc,'DefWindowProcA',\
    85.               TranslateMessage,'TranslateMessage',\
    86.               DispatchMessage,'DispatchMessageA',\
    87.               LoadCursor,'LoadCursorA',\
    88.               LoadIcon,'LoadIconA',\
    89.               PostQuitMessage,'PostQuitMessage',\
    пишет что illegal instruction : hwnd HWND
    че этому фасму не нравится?
     
  2. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    Попробуй написать hwnd dd 0
     
  3. goga2007

    goga2007 New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2007
    Сообщения:
    184
    теперь ему не нравится "mov hwnd ,eax"
    Код (Text):
    1. ......   invoke   RegisterClass,wc
    2.           invoke   CreateWindowEx,0,_class,hint,ws,10,10,680,450,NULL,NULL,[hinstance],NULL
    3.           mov      hwnd,eax
    4.           invoke   ShowWindow,hwnd,0
    5.           jmp      mloop.......
     
  4. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    mov [hwnd] , eax

    не путать с масмом
     
  5. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    goga2007
    и потом
    invoke ShowWindow,[hwnd],0

    т.е. там где нужен не адрес переменной а её непосредственное значение, нужно заключать имя в квадратные скобки. Иногда при этом нужно указывать размер переменной. Все эти тонкости прекрасно расписаны в самом начале руководства по фасму.
     
  6. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    invoke ShowWindow, [hwnd], 0

    черт, опередил :)
     
  7. goga2007

    goga2007 New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2007
    Сообщения:
    184
    undefined simbol: invoke GetModuleHandle,0
    Код (Text):
    1.  .... start:
    2.           invoke   GetModuleHandle,NULL
    3.           mov      [wc.hInstance],eax
    4.           mov      [hinstance],eax  .....
    никто не знает где уроки под fasm найти?
     
  8. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Код (Text):
    1. import kernel32,\
    2.          GetModuleHandle,'GetModuleHandleA',\
    3.          ExitProcess,'ExitProcess'
     
  9. goga2007

    goga2007 New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2007
    Сообщения:
    184
    исправил вроде, появился контур окна ,но сразу исчез,а после повторной компиляции появ. ошибка: error: write failed
     
  10. goga2007

    goga2007 New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2007
    Сообщения:
    184
    вот новый код
    Код (Text):
    1. format PE GUI 4.0
    2. entry start
    3.  
    4. include 'C:\program files\tools\fasmw167\include\win32a.inc'
    5. section '.data' data readable writeable
    6.     caption db 'author is cool hacker',0
    7.     text    db 'its coolest programm',0
    8.     mymessage db 'reaction',0
    9.     hinstance dd 0
    10.     mes     db 'its a message',0
    11.  
    12.     msg    MSG
    13.     wc     WNDCLASS
    14.  
    15.     hwnd  dd 0
    16.     hDC     db 0
    17.     ws      equ WS_VISIBLE+WS_CAPTION+WS_MINIMIZEBOX+WS_SYSMENU
    18.     _class  db 'FCAPTION',0
    19.     hint    db 'indifferently',0
    20.  
    21. section  '.code' code readable executable
    22.  
    23.     start:
    24.           invoke   GetModuleHandle,NULL
    25.           mov      [wc.hInstance],eax
    26.           mov      [hinstance],eax
    27.           invoke   LoadIcon ,0,IDI_APPLICATION
    28.           mov      [wc.hIcon],eax
    29.           invoke   LoadCursor,0,IDC_ARROW
    30.           mov      [wc.hCursor],eax
    31.           mov      [wc.style],0
    32.           mov      [wc.lpfnWndProc],WindowProc
    33.           mov      [wc.cbClsExtra],0
    34.           mov      [wc.cbWndExtra],0
    35.           mov      [wc.hbrBackground],COLOR_WINDOW+1
    36.           mov      [wc.lpszMenuName],0
    37.           mov      [wc.lpszClassName],_class
    38.  
    39.           invoke   RegisterClass,wc
    40.           invoke   CreateWindowEx,0,_class,hint,ws,10,10,680,450,NULL,NULL,[hinstance],NULL
    41.           mov      [hwnd],eax
    42.           invoke   ShowWindow,[hwnd],0
    43.           jmp      mloop
    44.  
    45. mloop:
    46.           invoke   GetMessage,msg,NULL,0,0
    47.           or       eax,eax
    48.           jz       exit
    49.           invoke   TranslateMessage,msg
    50.           invoke   DispatchMessage,msg
    51.           jmp      mloop
    52.  
    53. exit:
    54.           invoke   ExitProcess,0
    55.  
    56. proc  WindowProc,hwnd,wmsg,wparam,lparam
    57.  
    58.           push     ebx esi edi
    59.           cmp      [wmsg],WM_DESTROY
    60.           je       wmdestroy
    61.           invoke   DefWindowProc,[hwnd],[wmsg],[wparam],[lparam]
    62.           pop      edi esi ebx
    63.           ret
    64.  
    65. wmdestroy:
    66.           invoke   PostQuitMessage,0
    67.           xor      eax,eax
    68.           ret
    69.  
    70. endp
    71.  
    72. section '.idata' import data readable writeable
    73.           library  kernel,'KERNEL32.DLL',\
    74.                    user,'USER32.DLL'
    75.  
    76.  
    77.          import kernel,\
    78.                 GetModuleHandle,'GetModuleHandleA',\
    79.                       ExitProcess,'ExitProcess'
    80.  
    81.          import user,\
    82.                RegisterClass,'RegisterClassA',\
    83.                       CreateWindowEx,'CreateWindowExA',\
    84.                       DefWindowProc,'DefWindowProcA',\
    85.                       TranslateMessage,'TranslateMessage',\
    86.                       DispatchMessage,'DispatchMessageA',\
    87.                       LoadCursor,'LoadCursorA',\
    88.                       LoadIcon,'LoadIconA',\
    89.                       PostQuitMessage,'PostQuitMessage',\
    90.                       ShowWindow,'ShowWindow',GetMessage,'GetMessageA'
     
  11. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    процесс убивать надо. винда не даст писать в запущенный EXE
     
  12. goga2007

    goga2007 New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2007
    Сообщения:
    184
    да,да,да. ток что увидел штук 8 таких процессов в диспетчере задач.
    а чтоб убить его что надо сделать?(в смысле в программе; этих я уже убил)
     
  13. goga2007

    goga2007 New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2007
    Сообщения:
    184
    все ,всем большое спасибо -окно висит(я добавил UpdateWindow и оно повисло)!!!!!!
     
  14. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    goga2007
    В догонку,
    1) в стиле окна у тебя было указано WS_VISIBLE поэтому функции ShowWindow и
    UpdateWindow можно было и не вызывать, соответственно переменная hwnd тебе бы и не понадобилась
    2) если при компиляции были заданы стандартные ключи, GetModuleHandle всегда возвращает значение 400000h поэтому можно было сразу писать
    mov [wc.hInstance],400000h
    поэтому надобности в GetModuleHandle не было
    3) Для набора стандартных системных иконок и курсоров значения, возвращаемые функциями
    LoadCursor и LoadIcon будут одними и теми же, и в Win98 и WinXp разных SP, проверял!
    mov [wc.hIcon],10003h ;Иконка окна по умолчанию
    mov [wc.hCursor],10011h ;Курсор окна по умолчанию
    4) Если не обрабатываются сообщение клавиатуры TranslateMessage не нужен
    5) 90% приложений, и твое в том числе, можно закончить обычным ret вместо ExitProcess
    6) в WindowProc значения ebx esi edi не изменялись, поэтому push и pop ни к чему
    7) функции DefWindowProc передаются те же параметры что и для функции WindowProc
    поэтому достаточно будет поставить jmp вместо invoke, что избавляет тебя еще и от ret 10h
    8) Чем короче код, тем меньше ошибок!!! :)
     
  15. goga2007

    goga2007 New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2007
    Сообщения:
    184
    подскажите где почитать про стандартные ключи и ваще шо це таке?
    действительно все работает и без этих функций(а я думал,что работать стало из-за АПДЕЙТа)
    у меня почемуто они обрабатываются и без него(в левом верх. углу выпадает контекст.меню)
    ваще я пришел поделиться опытом с теми,кто тоже начал изучать асм с фасма и ищет код первого окна, а оказывается у меня там все криво - не буду его оставлять.
     
  16. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    в справке фасма.
     
  17. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    В фасме появились какие-то ключи? :)

    goga2007
    Посмотрите в MSDN описание функции TranslateMessage и Вы поймёте зачем и нужна ли она Вам.
     
  18. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    я думал по аналогии с link /base:0x400000
     
  19. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    какие-то вроде были для управления выделением памяти при компиляции,
    если ничего не путаю
     
  20. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    и ещё максимальное количество проходов, вроде. Что-то ещё было, но я не помню, надо в справку глянуть :)
    В фасме почти всё задается директивами в сорце.