FASM x64

Тема в разделе "WASM.X64", создана пользователем Orbit, 18 май 2017.

  1. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.548
    Адрес:
    Russia
    Выключите Антивирус . Ваш Кэп
     
  2. Orbit

    Orbit Member

    Публикаций:
    0
    Регистрация:
    13 дек 2016
    Сообщения:
    110
    Адрес:
    г. Москва
    Вылечил, в исходнике переставил местами секции '.code' и '.data'
     
  3. Orbit

    Orbit Member

    Публикаций:
    0
    Регистрация:
    13 дек 2016
    Сообщения:
    110
    Адрес:
    г. Москва
    Помогите создать простое окно

    Код (ASM):
    1.  
    2. format PE64 GUI 6.0
    3. entry start
    4. include 'win64a.inc'
    5. section '.code' code readable executable
    6. proc start
    7.  
    8.   invoke GetModuleHandleW,0
    9.   mov [wc.hInstance],rax
    10.  
    11.   invoke RegisterClass,wc
    12.  
    13.   invoke CreateWindowEx,0,_class,_title,WS_VISIBLE+WS_OVERLAPPEDWINDOW,144,128,666,666,NULL,NULL,[wc.hInstance],NULL
    14.   mov [hwnd],rax
    15.  
    16.   invoke ShowWindow,hwnd,0
    17.   invoke UpdateWindow,hwnd
    18.  
    19.   msg_loop:
    20.   invoke  GetMessage,msg,NULL,0,0
    21.   cmp  eax,1
    22.   jb  exit
    23.   jne  msg_loop
    24.   invoke  TranslateMessage,msg
    25.   invoke  DispatchMessage,msg
    26.   jmp  msg_loop
    27.  
    28. exit:
    29.   invoke ExitProcess,eax
    30. endp
    31.  
    32. proc WindowProc hwnd,wmsg,wparam,lparam
    33.  
    34.   invoke DefWindowProc,[hwnd],[wmsg],[wparam],[lparam]
    35.   jmp exit
    36.  
    37. endp
    38.  
    39. section '.data' data readable writeable
    40.  
    41.  hwnd dq ?
    42.  
    43.   _title TCHAR 'CLOCK',0
    44.   _class TCHAR 'CLOCK',0
    45.  
    46. wc WNDCLASS 0,WindowProc,0,0,NULL,NULL,NULL,COLOR_BTNFACE+1,NULL,_class
    47. msg MSG
    48.  
    49. section '.idata' import data readable writeable
    50.  
    51.   library kernel,'KERNEL32.DLL',\
    52.   user,'USER32.DLL'
    53.  
    54.   import kernel,\
    55.   ExitProcess,'ExitProcess',\
    56.   GetModuleHandleW,'GetModuleHandleW',\
    57.   Sleep,'Sleep'
    58.  
    59.   import user,\
    60.   UpdateWindow,'UpdateWindow',\
    61.   ShowWindow,'ShowWindow',\
    62.   RegisterClass,'RegisterClassA',\
    63.   CreateWindowEx,'CreateWindowExA',\
    64.   DefWindowProc,'DefWindowProcA',\
    65.   GetMessage,'GetMessageA',\
    66.   TranslateMessage,'TranslateMessage',\
    67.   DispatchMessage,'DispatchMessageA'
    68.  
     
  4. yashechka

    yashechka Ростовский фанат Нарвахи

    Публикаций:
    90
    Регистрация:
    2 янв 2012
    Сообщения:
    1.449
    Адрес:
    Россия
    Код (ASM):
    1. format PE GUI 4.0
    2. entry start
    3. include "d:\compilers\fasm\include\win32ax.inc"
    4. section ".data" data readable writable
    5.     wndClass db "FASMWND", 0
    6.     wndTitle db "FASM Window", 0
    7.    
    8.     _hWnd dd ?
    9.     _hInstance dd ?
    10.    
    11.     wc WNDCLASSEX ?
    12.     msg MSG ?
    13.    
    14. section ".idata" import data readable writable
    15.     library kernel32, 'kernel32.dll', user32, 'USER32.DLL'
    16.    
    17.     include "d:\compilers\fasm\include\api\kernel32.inc"
    18.     include "d:\compilers\fasm\include\api\user32.inc"
    19.    
    20. section ".text" code readable writable executable
    21. start:
    22.     invoke GetModuleHandle, NULL
    23.     mov [_hInstance], eax
    24.     mov [wc.hInstance], eax
    25.    
    26.     mov [wc.cbSize], sizeof.WNDCLASSEX
    27.     mov [wc.style], CS_HREDRAW or CS_VREDRAW
    28.     mov [wc.lpfnWndProc], wndProc
    29.     mov [wc.cbClsExtra], 0
    30.    
    31.    
    32.     invoke LoadIcon, 0, IDI_APPLICATION
    33.     mov [wc.hIcon], eax
    34.     mov [wc.hIconSm], eax
    35.    
    36.     invoke LoadCursor, 0, IDC_ARROW
    37.     mov [wc.hCursor], eax
    38.    
    39.     mov [wc.hbrBackground], COLOR_WINDOW+1
    40.     mov [wc.lpszMenuName], NULL
    41.     mov [wc.lpszClassName], wndClass
    42.    
    43.     invoke RegisterClassEx, wc
    44.     invoke CreateWindowEx, 0, wndClass, wndTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 300, 200, NULL, NULL, [_hInstance], NULL
    45.     mov [_hWnd], eax
    46.     invoke ShowWindow, [_hWnd], SW_SHOW
    47.    
    48.    
    49. msg_loop:
    50.     invoke GetMessage, msg, NULL, 0, 0
    51.     or eax, eax
    52.     je end_prog
    53.    
    54.     invoke  TranslateMessage, msg
    55.     invoke  DispatchMessage, msg
    56.     jmp msg_loop
    57.    
    58. end_prog:
    59.     invoke ExitProcess, [msg.wParam]
    60.    
    61. proc wndProc hWnd, msg, wParam, lParam
    62.     push ebx esi edi
    63.     cmp [msg], WM_DESTROY
    64.     je destroyWnd
    65.    
    66.     invoke DefWindowProc, [hWnd], [msg], [wParam], [lParam]
    67.     jmp finish
    68.    
    69.     destroyWnd:
    70.     invoke PostQuitMessage, 0
    71.    
    72.     finish:
    73.     pop ebx esi edi
    74.     ret
    75.    
    76. endp
     
  5. yashechka

    yashechka Ростовский фанат Нарвахи

    Публикаций:
    90
    Регистрация:
    2 янв 2012
    Сообщения:
    1.449
    Адрес:
    Россия
    Там же в примерах всё есть
    Код (ASM):
    1. ; -------------------------------------------------------------------------------------
    2.  
    3.         ; FASM version of Win32 Hello World:
    4.  
    5.         ; http://msdn.microsoft.com/en-us/library/vstudio/bb384843.aspx
    6.  
    7. ; -------------------------------------------------------------------------------------
    8.  
    9. format PE GUI 4.0
    10.  
    11. entry win_main
    12.  
    13. include 'win32a.inc'
    14.  
    15. ; -------------------------------------------------------------------------------------
    16.  
    17. section '.code' code readable executable
    18.  
    19.   win_main:
    20.  
    21.         ; initialise the members of the wcex structure
    22.  
    23.         ; --------------------------------------------
    24.  
    25.         ; WNDCLASSEX
    26.  
    27.         ; UINT cbSize
    28.         ; UINT style
    29.         ; WNDPROC lpfnWndProc
    30.         ; int cbClsExtra
    31.         ; int cbWndExtra
    32.         ; HINSTANCE hInstance
    33.         ; HICON hIcon
    34.         ; HCURSOR hCursor
    35.         ; HBRUSH hbrBackground
    36.         ; LPCTSTR lpszMenuName
    37.         ; LPCTSTR lpszClassName
    38.         ; HICON hIconSm
    39.  
    40.         ; --------------------------------------------
    41.  
    42.         ; the instance handle
    43.  
    44.         invoke GetModuleHandle,0
    45.  
    46.         mov [wcex.hInstance],eax
    47.  
    48.         ; cbSize
    49.  
    50.         mov eax,sizeof.WNDCLASSEX
    51.  
    52.         mov [wcex.cbSize],eax
    53.  
    54.         ; the windows proc
    55.  
    56.         mov [wcex.lpfnWndProc],WndProc
    57.  
    58.         ; the windows style
    59.  
    60.         mov [wcex.style],CS_HREDRAW+CS_VREDRAW
    61.  
    62.         ; load the icons
    63.  
    64.         invoke LoadIcon,[wcex.hInstance],IDI_APPLICATION
    65.  
    66.         mov [wcex.hIcon],eax
    67.  
    68.         mov [wcex.hIconSm],eax
    69.  
    70.         ; load the cursor
    71.  
    72.         invoke LoadCursor,NULL,IDC_ARROW
    73.  
    74.         mov [wcex.hCursor],eax
    75.  
    76.         ; the brush for the background
    77.  
    78.         mov [wcex.hbrBackground],COLOR_WINDOW+1
    79.  
    80.         ; the windows class name
    81.  
    82.         mov dword [wcex.lpszClassName],szClass
    83.  
    84.         ; set to NULL
    85.  
    86.         mov [wcex.cbClsExtra],0
    87.  
    88.         mov [wcex.cbWndExtra],0
    89.  
    90.         mov dword [wcex.lpszMenuName],NULL
    91.  
    92.         ; register wcex
    93.  
    94.         ; RegisterClassEx(&wcex)
    95.  
    96.         invoke RegisterClassEx,wcex
    97.  
    98.         test eax,eax
    99.  
    100.         jz reg_error
    101.  
    102.         ; create the window
    103.  
    104.         invoke CreateWindowEx,0,szClass,szTitle,WS_OVERLAPPEDWINDOW,\
    105.                               CW_USEDEFAULT,CW_USEDEFAULT,\
    106.                               500,100,NULL,NULL,[wcex.hInstance],NULL
    107.  
    108.         test eax,eax
    109.  
    110.         jz cr_error
    111.  
    112.         mov [h_wnd],eax
    113.  
    114.         ; show and update the window
    115.  
    116.         ; ShowWindow(hWnd,SW_SHOWNORMAL)
    117.  
    118.         invoke ShowWindow,[h_wnd],SW_SHOWNORMAL
    119.  
    120.         ; UpdateWindow(hWnd)
    121.  
    122.         invoke UpdateWindow,[h_wnd]
    123.  
    124.   msg_loop:
    125.  
    126.         ; the main message loop
    127.  
    128.         ; GetMessage(&msg,NULL,0,0)
    129.  
    130.         invoke GetMessage,msg,NULL,0,0
    131.  
    132.         cmp eax,1
    133.  
    134.         jb exit
    135.  
    136.         jne msg_loop
    137.  
    138.         ; TranslateMessage(&msg)
    139.  
    140.         invoke TranslateMessage,msg
    141.  
    142.         ; DispatchMessage(&msg)
    143.  
    144.         invoke DispatchMessage,msg
    145.  
    146.         jmp msg_loop
    147.  
    148.   reg_error:
    149.  
    150.         invoke MessageBox,NULL,szRegError,szTitle,MB_ICONERROR+MB_OK
    151.  
    152.         jmp exit
    153.  
    154.   cr_error:
    155.  
    156.         invoke MessageBox,NULL,szCreateError,szTitle,MB_ICONERROR+MB_OK
    157.  
    158.   exit:
    159.  
    160.         ; return msg.wParam
    161.  
    162.         invoke  ExitProcess,[msg.wParam]
    163.  
    164. ; -------------------------------------------------------------------------------------
    165.  
    166. proc WndProc uses ebx esi edi,hwnd,wmsg,wparam,lparam
    167.  
    168.   ; WndProc(hwnd,wmsg,wparam,lparam)
    169.  
    170.   ; callback function to process messages for the main window
    171.  
    172.         cmp [wmsg],WM_PAINT
    173.  
    174.         je .PAINT
    175.  
    176.         cmp [wmsg],WM_DESTROY
    177.  
    178.         je .DESTROY
    179.  
    180.   .DEFAULT:
    181.  
    182.         ; DefWindowProc(hWnd,message,wParam,lParam)
    183.  
    184.         invoke DefWindowProc,[hwnd],[wmsg],[wparam],[lparam]
    185.  
    186.         jmp .DONE
    187.  
    188.   .PAINT:
    189.  
    190.         ; hdc = BeginPaint(hWnd,&ps)
    191.  
    192.         invoke BeginPaint,[hwnd],ps
    193.  
    194.         mov [hdc],eax
    195.  
    196.         ; TextOut(hdc,5,5,greeting,len(greeting))
    197.  
    198.         invoke TextOut,[hdc],5,5,szGreeting,12
    199.  
    200.         ; EndPaint(hWnd,&ps)
    201.  
    202.         invoke EndPaint,[hwnd],ps
    203.  
    204.         jmp .DONE
    205.  
    206.   .DESTROY:
    207.  
    208.         ; PostQuitMessage(0)
    209.  
    210.         invoke PostQuitMessage,0
    211.  
    212.         xor eax,eax
    213.  
    214.   .DONE:
    215.  
    216.         ret
    217.  
    218. endp
    219.  
    220. ; -------------------------------------------------------------------------------------
    221.  
    222. section '.idata' import data readable writeable
    223.  
    224.   library kernel,'KERNEL32.DLL',\
    225.           user,'USER32.DLL',\
    226.           gdi,'GDI32.DLL'
    227.  
    228.   import kernel,\
    229.          GetModuleHandle,'GetModuleHandleA',\
    230.          ExitProcess,'ExitProcess'
    231.  
    232.   import user,\
    233.          RegisterClassEx,'RegisterClassExA',\
    234.          CreateWindowEx,'CreateWindowExA',\
    235.          ShowWindow,'ShowWindow',\
    236.          UpdateWindow,'UpdateWindow',\
    237.          GetMessage,'GetMessageA',\
    238.          TranslateMessage,'TranslateMessage',\
    239.          DispatchMessage,'DispatchMessageA',\
    240.          MessageBox,'MessageBoxA',\
    241.          DefWindowProc,'DefWindowProcA',\
    242.          BeginPaint,'BeginPaint',\
    243.          EndPaint,'EndPaint',\
    244.          PostQuitMessage,'PostQuitMessage',\
    245.          LoadIcon,'LoadIconA',\
    246.          LoadCursor,'LoadCursorA'
    247.  
    248.   import gdi,\
    249.          TextOut,'TextOutA'
    250.  
    251. ; -------------------------------------------------------------------------------------
    252.  
    253. section '.data' readable writeable
    254.  
    255.   szClass TCHAR "Win32app",0
    256.  
    257.   szTitle TCHAR "Win32 Application",0
    258.  
    259.   szGreeting TCHAR "Hello World!",0
    260.  
    261.   szRegError TCHAR "Call to RegisterClassEx failed!",0
    262.  
    263.   szCreateError TCHAR "Call to CreateWindowEx failed!",0
    264.  
    265.   wcex WNDCLASSEX
    266.  
    267.   ps PAINTSTRUCT
    268.  
    269.   msg MSG
    270.  
    271.   h_wnd dd 0
    272.  
    273.   hdc dd 0
    274.  
    275. ; -------------------------------------------------------------------------------------
     
  6. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.709
  7. njeen

    njeen Active Member

    Публикаций:
    0
    Регистрация:
    26 мар 2017
    Сообщения:
    138
    Адрес:
    Ташлинск
  8. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.709
    njeen,
    в смысле на Бейсике?:scratch_one-s_head: Orbit, пишет в топике FASM x64
    yashechka дает пример окна для 32-разрядного FASM, а это не совсем то, о чем спрашивал Orbit, поэтому я дал ссылку на цикл статей о х64, правда программы в цикле написаны на masm, но перейти с masm на fasm, IMHO, не так уж сложно...
     
  9. njeen

    njeen Active Member

    Публикаций:
    0
    Регистрация:
    26 мар 2017
    Сообщения:
    138
    Адрес:
    Ташлинск
    в смысле, что это упорото. Дали бы ссылку на оригинал
     
  10. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.709
    в смысле "упорото"? давайте разбираться со ссылками, откуда я по вашему это "упорол"? да еще бы и выложил спертое сперва на http://www.masm32.com/board/index.php (http://masm32.com/board/index.php?topic=4190.0) потом несколько глав на wasm.ru до его закрытия, потом сюда
     
  11. njeen

    njeen Active Member

    Публикаций:
    0
    Регистрация:
    26 мар 2017
    Сообщения:
    138
    Адрес:
    Ташлинск
    "упорото" - производит впечатление сделанного под веществами. Ваши адаптации цикла x86 Iczelion'а для x86_64 мне приходилось видеть, в т.ч на wasm.ru, я в курсе вашего авторства данной вещи . Однако, разве нет каноничной версии ? Наркомания же.
     
  12. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.709
    njeen,
    а я сперва подумал, что «упорото» это синоним «спёрто», ладно, хоть этот вопрос решили. «Канонический вариант» это, наверное, «голый код» на masm32.com и то, только потому, что английский у меня через google.translate. Русский текст — это мои тексты + фрагменты из переводов Aquila, SheSan (ODBC Tutorial), WD-40 (Урок 23, 25), N/A (Урок 33), переводы из MSDN и фрагменты из книг Чарльза Петцольда «Программирование для Windows® 95» 1996 (оригинал), 1997 (русский перевод издания «BHV — Санкт-Петербург») в двух томах, на которые опирался Iczelion при создании своих уроков.
     
  13. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.709
    Orbit,
    давай по порядку.
    1. Прежде чем вызывать функцию RegisterClass нужно иметь полностью заполненные поля структуры WNDCLASS
      Код (C++):
      1. typedef struct tagWNDCLASS {
      2.   UINT  style;
      3.   WNDPROC  lpfnWndProc;
      4.   int  cbClsExtra;
      5.   int  cbWndExtra;
      6.   HINSTANCE hInstance;
      7.   HICON  hIcon;
      8.   HCURSOR  hCursor;
      9.   HBRUSH  hbrBackground;
      10.   LPCTSTR  lpszMenuName;
      11.   LPCTSTR  lpszClassName;
      12. } WNDCLASS
    2. Чтобы в каждой программе каждый раз перед регистрацией окна не вызывать GetModuleHandle, LoadIcon, LoadCursor один раз напиши такую программку
      Код (ASM):
      1. .data
      2. fmt db "hCursor = %08Xh",0Ah,"hIcon = %08Xh",0Ah,"hInstance =%08Xh",0
      3. .code  
      4.       invoke GetModuleHandle,NULL
      5.        mov [x1],rax
      6.        invoke LoadIcon,NULL,IDI_APPLICATION
      7.        mov [x2],rax
      8.         invoke LoadCursor,NULL,IDC_ARROW
      9.         mov [x3],rax
      10.         invoke wsprintf,buffer,fmt,[x3],[x2],[x1]
      11.         invoke MessageBox,NULL,buffer,MsgCaption,MB_OK
      12.         invoke ExitProcess,NULL
      и после этого используй найденные константы для заполнения полей hInstance, hIcon, hCursor. Для твоей версии Windows они всегда будут одинаковыми
      [​IMG]
    3. для функции CreateWindowEx требуется заполненная структура WNDCLASSEX и функция RegisterClassEx для ее регистрации
    4. четвертым параметром передаваемым CreateWindowEx у тебя WS_VISIBLE + WS_OVERLAPPEDWINDOW при наличии WS_VISIBLE последующий вызов ShowWindow и UpdateWindow не нужен.
    5. Код (ASM):
      1. cmp  eax,1
      2.   jb  exit
      3.   jne  msg_loop
      4.   invoke  TranslateMessage,msg
      5.   invoke  DispatchMessage,msg
      если GetMessage вернет в RAX (а не в ЕАХ приложение-то 64-разрядное) ноль, тогда на выход из программы и это правильно, а вот дальше стоит для чего-то команда
      jne msg_loop
      которая пропускает к функциям TranslateMessage и DispatchMessage только в том случае если rax=1 Хотя согласно MSDN GetMessage return value can be nonzero, zero, or -1... The possibility of a -1 return value in the case that hWnd is an invalid parameter (such as referring to a window that has already been destroyed) means that such code can lead to fatal application errors
    6. WindowProc получает значения hwnd, wmsg, wparam, lparam через регистры RCX, RDX, R8, R9, а вот переменные [hwnd], [wmsg], [wparam], [lparam] которые расположены в стеке, нужно предварительно заполнить командами
      Код (ASM):
      1. mov [hwnd],rcx
      2. mov [wmsg],rdx
      3. mov [wparam],r8
      4. mov [lparam],r9
      и этот фрагмент в примере fasm\examples\win64\template\template.asm есть, посмотри внимательно:rtfm:, иначе в строке
      invoke DefWindowProc,[hwnd],[wmsg],[wparam],[lparam]
      функции DefWindowProc в качестве параметров передаются нули
    7. Функции ExitProcess и DefWindowProc это всего лишь "переходники" к функциям RtlExitUserProcess и NtdllDefWindowProc_A из ntdll.dll привыкай использовать их
    8. Твоя процедура WindowProc
      Код (ASM):
      1. proc WindowProc hwnd,wmsg,wparam,lparam
      2.   invoke DefWindowProc,[hwnd],[wmsg],[wparam],[lparam]
      3.   jmp exit
      4. endp
      это вообще ЧТО-ТО за гранью добра и зла. WindowProc должна выглядеть вот так
      Код (ASM):
      1. proc WindowProc hwnd,wmsg,wparam,lparam
      2.        mov     [hwnd],rcx
      3.        mov     [wmsg],rdx
      4.        mov     [wparam],r8
      5.        mov     [lparam],r9
      6.  
      7.     cmp    [wmsg],WM_DESTROY
      8.     jne    .defwndproc
      9.     invoke    PostQuitMessage,0
      10.     ret
      11. .defwndproc:
      12.     invoke    DefWindowProc,[hwnd],[wmsg],[wparam],[lparam]
      13.     ret
      14. endp
     
    Indy_ нравится это.
  14. Orbit

    Orbit Member

    Публикаций:
    0
    Регистрация:
    13 дек 2016
    Сообщения:
    110
    Адрес:
    г. Москва
  15. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.709
    Код (ASM):
    1. format PE64 GUI 6.0
    2. entry start
    3. include 'win64a.inc'
    4. section '.code' code readable executable
    5. ;-----------------------------------------------------------------------
    6. start:
    7.         sub     rsp,8           ; Make stack dqword aligned
    8.         invoke GetModuleHandle,0
    9.         mov [wc.hInstance],rax
    10.         mov [wc.cbSize],sizeof.WNDCLASSEX
    11.         mov [wc.style],CS_HREDRAW or CS_VREDRAW
    12.         mov [wc.lpfnWndProc],WindowProc
    13.         mov [wc.cbClsExtra],0
    14.         invoke LoadIcon,0,IDI_APPLICATION
    15.         mov [wc.hIcon],rax
    16.         mov [wc.hIconSm],rax
    17.         invoke LoadCursor,0,IDC_ARROW
    18.         mov [wc.hCursor],rax
    19.         mov [wc.hbrBackground],COLOR_WINDOW+1
    20.         mov [wc.lpszMenuName],NULL
    21.         mov [wc.lpszClassName],szTitle
    22.         invoke RegisterClassEx,wc
    23.         invoke CreateWindowEx,0,szTitle,szTitle,WS_VISIBLE + WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,500,100,NULL,NULL,[wc.hInstance],NULL
    24. msg_loop:
    25.         invoke  GetMessage,msg,NULL,0,0
    26.         or      rax,rax
    27.         je      exit
    28.         invoke  TranslateMessage,msg
    29.         invoke  DispatchMessage,msg
    30.         jmp     msg_loop
    31.   exit:
    32.         invoke ExitProcess,[msg.wParam]
    33. ;--------------------------------------------------------------------------------
    34. proc WindowProc hwnd,wmsg,wparam,lparam
    35.         mov [hwnd],rcx
    36.         mov [wmsg],rdx
    37.         mov [wparam],r8
    38.         mov [lparam],r9
    39.         cmp [wmsg],WM_DESTROY
    40.         jne .defwndproc
    41.         invoke PostQuitMessage,0
    42.         ret
    43.     .defwndproc:
    44.         invoke DefWindowProc,[hwnd],[wmsg],[wparam],[lparam]
    45.         ret
    46. endp
    47. ;----------------------------------------------------------------------
    48. section '.data' data readable writeable
    49. szTitle db 'CLOCK',0
    50. wc WNDCLASSEX
    51. msg MSG
    52. ;------------------------------------------------------------------------
    53. section '.idata' import data readable writeable
    54.   library kernel,'KERNEL32.DLL',\
    55.           user,'USER32.DLL'
    56.   import kernel,\
    57.          ExitProcess,'ExitProcess',\
    58.          GetModuleHandle,'GetModuleHandleA'
    59.   import user,\
    60.   PostQuitMessage,'PostQuitMessage',\
    61.          LoadIcon,'LoadIconA',\
    62.          LoadCursor,'LoadCursorA',\
    63.          RegisterClassEx,'RegisterClassExA',\
    64.          CreateWindowEx,'CreateWindowExA',\
    65.          DefWindowProc,'DefWindowProcA',\
    66.          GetMessage,'GetMessageA',\
    67.          TranslateMessage,'TranslateMessage',\
    68.          DispatchMessage,'DispatchMessageA'
    69.  
    [​IMG]
     

    Вложения:

    • FASM64.png
      FASM64.png
      Размер файла:
      9,2 КБ
      Просмотров:
      1.509
  16. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.709
    так программа выглядит после упрощения
    Код (ASM):
    1. format PE64 GUI 6.0
    2. entry start
    3. include 'win64a.inc'
    4. section '.code' code readable executable
    5. ;-----------------------------------------------------------------------
    6. proc start
    7. local wc:WNDCLASSEX
    8. local msg:MSG
    9.         mov [wc.hInstance],400000h
    10.         mov [wc.cbSize],sizeof.WNDCLASSEX
    11.         mov [wc.style],CS_HREDRAW or CS_VREDRAW
    12.         mov [wc.lpfnWndProc],WindowProc
    13.         mov [wc.cbClsExtra],0
    14.         invoke LoadIcon,0,IDI_APPLICATION
    15.         mov [wc.hIcon],rax
    16.         mov [wc.hIconSm],rax
    17.         invoke LoadCursor,0,IDC_ARROW
    18.         mov [wc.hCursor],rax
    19.         mov [wc.hbrBackground],COLOR_WINDOW+1
    20.         mov [wc.lpszMenuName],NULL
    21.         mov [wc.lpszClassName],szTitle
    22.         lea ecx,[wc]
    23.         invoke RegisterClassEx
    24.         invoke CreateWindowEx,0,szTitle,szTitle,WS_VISIBLE + WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 500, 100, NULL, NULL, 400000h, NULL
    25.         lea edi,[msg]
    26. msg_loop:
    27.         invoke  GetMessage,edi,NULL,0,0
    28.         invoke  DispatchMessage,edi
    29.         jmp     msg_loop
    30. endp
    31. proc WindowProc hwnd,wmsg,wparam,lparam
    32.         cmp edx,WM_DESTROY
    33.         jne .defwndproc
    34.         invoke ExitProcess,0
    35.     .defwndproc:
    36.         leave
    37.         jmp [DefWindowProc]
    38. endp
    39. ;----------------------------------------------------------------------
    40. section '.data' data readable writeable
    41. szTitle db 'CLOCK',0
    42. ;------------------------------------------------------------------------
    43. section '.idata' import data readable writeable
    44.   library kernel,'KERNEL32.DLL',\
    45.           user,'USER32.DLL'
    46.   import kernel,\
    47.          ExitProcess,'ExitProcess'
    48.   import user,\
    49.          LoadIcon,'LoadIconA',\
    50.          LoadCursor,'LoadCursorA',\
    51.          RegisterClassEx,'RegisterClassExA',\
    52.          CreateWindowEx,'CreateWindowExA',\
    53.          DefWindowProc,'DefWindowProcA',\
    54.          GetMessage,'GetMessageA',\
    55.          DispatchMessage,'DispatchMessageA'
     
  17. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.709
    А это финальный этап
    Код (ASM):
    1. format PE64 GUI 6.0
    2. entry start
    3. include 'win64a.inc'
    4. section '.code' code readable executable writeable
    5. ;-----------------------------------------------------------------------
    6. proc start
    7. local wc:WNDCLASSEX
    8. local msg:MSG
    9.         sub esp,60h
    10.         mov esi,400000h            ;esi=hInstance
    11.         mov [wc.hInstance],rsi
    12.         mov [wc.cbSize],sizeof.WNDCLASSEX
    13.         mov [wc.style],CS_HREDRAW or CS_VREDRAW
    14.         mov [wc.lpfnWndProc],WindowProc
    15.         xor ecx,ecx
    16.         mov [wc.cbClsExtra],ecx
    17.         mov [wc.lpszMenuName],rcx
    18.         mov edx,IDI_APPLICATION
    19.         call [LoadIcon]
    20.         mov [wc.hIcon],rax
    21.         mov [wc.hIconSm],rax
    22.         mov edx,IDC_ARROW
    23.         xor ecx,ecx
    24.         call [LoadCursor]
    25.         mov [wc.hCursor],rax
    26.         mov [wc.hbrBackground],COLOR_WINDOW+1
    27.         mov edi,szTitle
    28.         mov [wc.lpszClassName],rdi
    29.         lea ecx,[wc]
    30.         call [RegisterClassEx]
    31.         xor ecx,ecx
    32.         mov edx,edi                      ;szTitle
    33.         mov r8d,edi
    34.         mov r9d,WS_VISIBLE + WS_OVERLAPPEDWINDOW    
    35.         mov [rsp+50h],rsi       ;hInstance
    36.         shl esi,9                         ;esi=CW_USEDEFAULT
    37.         mov [rsp+20h],rsi
    38.         mov [rsp+28h],rsi
    39.         mov qword[rsp+30h],500
    40.         mov qword[rsp+38h],100
    41.         mov [rsp+40h],rcx
    42.         mov [rsp+48h],rcx
    43.         mov [rsp+58h],rcx
    44.         call [CreateWindowEx]
    45.         lea edi,[msg]
    46. msg_loop:
    47.         mov ecx,edi
    48.         xor edx,edx
    49.         xor r8,r8
    50.         xor r9,r9
    51.         call  [GetMessage]
    52.         mov ecx,edi
    53.         call [DispatchMessage]
    54.         jmp     msg_loop
    55. endp
    56. WindowProc:
    57.         push rbp
    58.         mov ebp,esp
    59.         sub esp,20h
    60.         cmp edx,WM_DESTROY
    61.         jne .defwndproc
    62.         xor ecx,ecx
    63.         call [RtlExitUserProcess]
    64.     .defwndproc:
    65.         leave
    66.         jmp [NtdllDefWindowProc]
    67. ;----------------------------------------------------------------------
    68. szTitle db 'CLOCK',0
    69. ;------------------------------------------------------------------------
    70. section '.idata' import data readable writeable
    71.   library ntdll,'ntdll.DLL',\
    72.           user,'USER32.DLL'
    73.   import ntdll,\
    74.          RtlExitUserProcess,'RtlExitUserProcess',\
    75.          NtdllDefWindowProc,'NtdllDefWindowProc_A'
    76.   import user,\
    77.          LoadIcon,'LoadIconA',\
    78.          LoadCursor,'LoadCursorA',\
    79.          RegisterClassEx,'RegisterClassExA',\
    80.          CreateWindowEx,'CreateWindowExA',\
    81.          GetMessage,'GetMessageA',\
    82.          DispatchMessage,'DispatchMessageA'
     
  18. Orbit

    Orbit Member

    Публикаций:
    0
    Регистрация:
    13 дек 2016
    Сообщения:
    110
    Адрес:
    г. Москва
    Гениально и с такой легкостью! Вы по-настоящему мастер своего дела! Спасибо!
     
  19. Orbit

    Orbit Member

    Публикаций:
    0
    Регистрация:
    13 дек 2016
    Сообщения:
    110
    Адрес:
    г. Москва
    Как запретить изменение размеров окна?
     
  20. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.709
    замени WS_VISIBLE + WS_OVERLAPPEDWINDOW на WS_OVERLAPPED + WS_VISIBLE + WS_CAPTION + WS_SYSMENU + WS_MINIMIZEBOX