Вопрос по FASM

Тема в разделе "WASM.BEGINNERS", создана пользователем GeNeZiS, 13 май 2008.

  1. GeNeZiS

    GeNeZiS New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    135
    Доброго времени суток, уважаемые.
    Интересует такой вопрос.
    Как в FASMe при компиляции добавить к файлу информацию о версии, авторе и т.д. + иконку.
    Благодарю за внимание.
     
  2. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    RTFM
    Конкретно: мануал по fasm'у, раздел 3.1.6 "Resources".
     
  3. GeNeZiS

    GeNeZiS New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    135
    Смотрю http://flatassembler.net/docs.php?article=manual
    не могу найти такой раздел... что за мануал у вас?
     
  4. Shtirlitz1945

    Shtirlitz1945 New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2008
    Сообщения:
    5
    Можно так:
    Код (Text):
    1. format PE GUI 4.0
    2. entry start
    3.  
    4. include 'win32a.inc'
    5.  
    6. section '.data' data readable writeable
    7.  
    8. cpt db 'Hello!',0
    9. msg db 'World',0
    10.  
    11. section '.code' code readable executable
    12.  
    13.   start:
    14.         invoke  MessageBox,HWND_DESKTOP,cpt,msg,MB_OK
    15.         invoke  ExitProcess,0
    16.  
    17.    ret
    18. section '.idata' import data readable writeable
    19.  
    20.   library kernel32,'KERNEL32.DLL',\
    21.            user32,'USER32.DLL'
    22.  
    23.  
    24.   include 'api\kernel32.inc'
    25.   include 'api\user32.inc'
    26.  
    27. section '.rsrc' resource data readable
    28.  
    29.    directory   RT_ICON,icons,\
    30.                   RT_GROUP_ICON,group_icons,\
    31.                RT_VERSION,versions
    32.  
    33.          resource icons,\
    34.            1,LANG_NEUTRAL,icon_data
    35.  
    36.           resource group_icons,\
    37.            17,LANG_NEUTRAL,main_icon
    38.  
    39.  
    40.           resource versions,\
    41.            1,LANG_NEUTRAL,version
    42.  
    43. icon main_icon,icon_data,'1.ico'
    44.  
    45.    versioninfo version,VOS__WINDOWS32,VFT_APP,VFT2_UNKNOWN,LANG_ENGLISH+SUBLANG_DEFAULT,0,\
    46.               'FileDescription','Hello World - example program',\
    47.               'LegalCopyright','©Microsoft Corporation. No rights reserved.',\
    48.               'CompanyName','Microsoft Corporation',\
    49.               'ProductName','Hello World',\
    50.               'FileVersion','1.0',\
    51.               'ProductVersion','1.0',\
    52.               'OriginalFilename','HELLO.EXE'
    но имхо проще отдельно ресурсы компилировать.
    Мануал идёт в комплекте с компилятором.
     
  5. GeNeZiS

    GeNeZiS New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    135
    Все нашел. Всем спасибо. Разобрался
     
  6. Loginanton

    Loginanton New Member

    Публикаций:
    0
    Регистрация:
    8 май 2008
    Сообщения:
    74
    А у меня такой вопрос: в каждой проге надо писать в конце импорт библиотек и функций win api. Можно это как то автоматизировать? А то это может и пол часа занять.
    Я вот про что говорю:
    Код (Text):
    1. section '.idata' import data readable writeable
    2.      library   KERNEL32, 'KERNEL32.DLL',\
    3.                USER32,   'USER32.DLL',\
    4.                GDI32,    'GDI32.DLL'
    5.  
    6.      import    KERNEL32,\
    7.                GetModuleHandle,    'GetModuleHandleA',\
    8.                ExitProcess,        'ExitProcess'
    9.  
    10.      import    USER32,\
    11.                RegisterClass,      'RegisterClassA',\
    12.                CreateWindowEx,     'CreateWindowExA',\
    13.                DefWindowProc,      'DefWindowProcA',\
    14.                ShowWindow,         'ShowWindow',\
    15.                LoadCursor,         'LoadCursorA',\
    16.                LoadIcon,           'LoadIconA',\
    17.                BeginPaint,         'BeginPaint',\
    18.                InvalidateRect,     'InvalidateRect',\
    19.                EndPaint,           'EndPaint',\
    20.                GetMessage,         'GetMessageA',\
    21.                TranslateMessage,   'TranslateMessage',\
    22.                DispatchMessage,    'DispatchMessageA',\
    23.                PostQuitMessage,    'PostQuitMessage'
    24.  
    25.      import    GDI32,\
    26.                TextOut,            'TextOutA'
     
  7. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    можно так

    Код (Text):
    1. section '.idata' import data readable
    2.  
    3. library kernel32,'KERNEL32.DLL',\
    4.         user32,'USER32.DLL'
    5.  
    6.  
    7. include '%fasminc%\APIA\KERNEL32.INC'
    8. include '%fasminc%\APIA\USER32.INC'
     
  8. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    При использовании win32ax.inc можно и в масмовском стиле:
    Код (Text):
    1. start:  ;=entry label
    2.   ...
    3. .end start ;создает секцию импорта
     
  9. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Ещё можно заюзать Vortex's scan

    Перед ассемблированием:
    scan.exe source.asm -f -o:idata.inc
    Scan находит все "invoke", "cinvoke" и создаёт файл idata.inc, в который прописывает весь импорт.
    Для инклудов, сканить которые на наличие импорта не нужно, можно поставить коммент ;*
     
  10. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    я юзаю макрос
    Код (Text):
    1.    macro USED [name,list] {
    2.    common  section '.idata' import data readable writeable
    3.    forward dd 0,0,0,RVA name#_str,RVA name#_table
    4.    common  dd 0,0,0,0,0
    5.    forward name#_str db `name#".DLL",0
    6.    forward name#_table:
    7.        irp label,list \{label dd RVA label\#_str \}
    8.        dd 0
    9.        irp label,list \{label\#_str db 0,0,\`label,0 \} }
    Код (Text):
    1. USED KERNEL32,<GetModuleHandleA,ExitProcess>,\
    2.         USER32,<RegisterClassA,CreateWindowExA,...>,\
    3.         ...
     
  11. Loginanton

    Loginanton New Member

    Публикаций:
    0
    Регистрация:
    8 май 2008
    Сообщения:
    74
    спасибо всем, мне больше всего способ Asterixа понравился
     
  12. dgs

    dgs New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2008
    Сообщения:
    434
    Еще интересный вариант:

    Код (Text):
    1. section '.idata' import data readable writeable
    2.  
    3. macro import lib,[functions]
    4. { common macro import_#lib \{ import lib,functions \} }
    5.  
    6. macro api [functions]
    7. { common macro all_api \{ all_api
    8.                           api functions \} }
    9. macro all_api {}
    10.  
    11. include '..\..\include\api/kernel32.inc'
    12. include '..\..\include\api/user32.inc'
    13. include '..\..\include\api/gdi32.inc'
    14. include '..\..\include\api/advapi32.inc'
    15. include '..\..\include\api/comctl32.inc'
    16. include '..\..\include\api/comdlg32.inc'
    17. include '..\..\include\api/shell32.inc'
    18. include '..\..\include\api/wsock32.inc'
    19.  
    20. purge import,api
    21.  
    22.      library kernel32,'KERNEL32.DLL',\
    23.              user32,'USER32.DLL',\
    24.              gdi32,'GDI32.DLL',\
    25.              advapi32,'ADVAPI32.DLL',\
    26.              comctl32,'COMCTL32.DLL',\
    27.              comdlg32,'COMDLG32.DLL',\
    28.              shell32,'SHELL32.DLL',\
    29.              wsock32,'WSOCK32.DLL'
    30.      import_kernel32
    31.      import_user32
    32.      import_gdi32
    33.      import_advapi32
    34.      import_comctl32
    35.      import_comdlg32
    36.      import_shell32
    37.      import_wsock32
    38.  
    39.      all_api
    И впихнуть это дело в файл к примеру Win32Api.inc и в каждый проект инклюдировать.
     
  13. Loginanton

    Loginanton New Member

    Публикаций:
    0
    Регистрация:
    8 май 2008
    Сообщения:
    74
    Народ помогите пожалуйста. Вот код программы (сам писал):
    Код (Text):
    1. format PE GUI
    2. entry start
    3.  
    4.     include 'include\win32a.inc'
    5.  
    6. section 'data' data readable writeable
    7.  
    8. _mHandle dd ?
    9. _iHandle dd ?
    10. _cHandle dd ?
    11. _wHandle dd ?
    12.  
    13. _wc WNDCLASS
    14. _msg MSG
    15.  
    16. _cName TCHAR 'MyClass',0
    17. _wName TCHAR 'My Window :D',0
    18.  
    19. section 'code' code readable executable
    20. start:
    21.  
    22. ;===== берём хендлы всего что пригодится =====
    23.  
    24. invoke GetModuleHandle, 0
    25. mov [_mHandle], eax
    26.  
    27. invoke LoadIcon, 0, IDI_APPLICATION
    28. mov [_iHandle], eax
    29.  
    30. invoke LoadCursor, 0, IDC_ARROW
    31. mov [_cHandle], eax
    32.  
    33. ;===== регистрируем класс =====
    34.  
    35. mov [_wc.style], CS_HREDRAW+CS_VREDRAW
    36. mov [_wc.lpfnWndProc], WindowProcess
    37. mov [_wc.cbClsExtra], 0
    38. mov [_wc.cbWndExtra], 0
    39. mov [_wc.hInstance], _mHandle
    40. mov [_wc.hIcon], _iHandle
    41. mov [_wc.hCursor], _cHandle
    42. mov [_wc.hbrBackground], COLOR_WINDOW
    43. mov [_wc.lpszMenuName], 0
    44. mov [_wc.lpszClassName], _cName
    45. invoke RegisterClass, _wc
    46.  
    47. ;===== создаём окно =====
    48.  
    49. invoke CreateWindowEx, 0, _cName, _wName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, _mHandle, 0
    50. mov [_wHandle], eax
    51.  
    52. ;===== показываем и обновляем =====
    53.  
    54. invoke ShowWindow, _wHandle, SW_NORMAL
    55. invoke UpdateWindow, _wHandle
    56.  
    57. ;===== бесконечный цикл =====
    58.  
    59. .LOL:
    60. invoke GetMessage, _msg, 0, 0, 0
    61. cmp eax, 0
    62. je .exit
    63. invoke TranslateMessage, _msg
    64. invoke DispatchMessage, _msg
    65. jmp .LOL
    66.  
    67. .exit:
    68.  
    69. invoke ExitProcess, [_msg.wParam]
    70.  
    71. proc WindowProcess wHandle, msg, wparam, lparam
    72.  
    73. cmp [msg], WM_DESTROY
    74. je .destroy
    75. invoke DefWindowProc, [wHandle], [msg], [wparam], [lparam]
    76. ret
    77.  
    78. .destroy:
    79.  
    80. invoke PostQuitMessage, 0
    81.  
    82. endp
    83.  
    84. section 'idata' import data readable
    85.  
    86.     library kernel32, 'KERNEL32.DLL', user32, 'USER32.DLL', gdi32, 'GDI32.DLL'
    87.  
    88.     include 'include\api\kernel32.inc'
    89.     include 'include\api\user32.inc'
    90.     include 'include\api\gdi32.inc'
    Собственно в чём проблема: пишет ошибку. Помогите пожалуйста найти ошибку в коде, а то я первый день кожу на фасме :)
    Заранее спасибо!
     
  14. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    На вскидку - ret нужен
    Код (Text):
    1. invoke PostQuitMessage, 0
    2. ret
    3. endp
    Насколько я понял, процедура считается только до 1го ret'а
    Поэтому в фасме лучше писать так:
    Код (Text):
    1. proc WindowProcess wHandle, msg, wparam, lparam
    2.  
    3. cmp [msg], WM_DESTROY
    4. je .destroy
    5. invoke DefWindowProc, [wHandle], [msg], [wparam], [lparam]
    6. jmp @ret
    7.  
    8. .destroy:
    9.  
    10. invoke PostQuitMessage, 0
    11. @ret:
    12. ret
    13. endp
    Это необходимо по многим причинам, например для правильного восстановления стека.
     
  15. Loginanton

    Loginanton New Member

    Публикаций:
    0
    Регистрация:
    8 май 2008
    Сообщения:
    74
    всё равно не компилится нормально
     
  16. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    Loginanton
    Какие сообщения об ошибках появляются? Я просто скопировал твой пример, он компилируется без ошибок, только со стеком были проблемы, где указал.

    Ошибка вознакает на
    ??
     
  17. Loginanton

    Loginanton New Member

    Публикаций:
    0
    Регистрация:
    8 май 2008
    Сообщения:
    74
    error: write failed
    Код (Text):
    1. format PE GUI
    2. entry start
    3.  
    4.     include 'include\win32a.inc'
    5.  
    6. section 'data' data readable writeable
    7.  
    8. _mHandle dd ?
    9. _iHandle dd ?
    10. _cHandle dd ?
    11. _wHandle dd ?
    12.  
    13. _wc WNDCLASS
    14. _msg MSG
    15.  
    16. _cName TCHAR 'MyClass',0
    17. _wName TCHAR 'My Window :D',0
    18.  
    19. section 'code' code readable executable
    20. start:
    21.  
    22. ;===== берём хендлы всего что пригодится =====
    23.  
    24. invoke GetModuleHandle, 0
    25. mov [_mHandle], eax
    26.  
    27. invoke LoadIcon, 0, IDI_APPLICATION
    28. mov [_iHandle], eax
    29.  
    30. invoke LoadCursor, 0, IDC_ARROW
    31. mov [_cHandle], eax
    32.  
    33. ;===== регистрируем класс =====
    34.  
    35. mov [_wc.style], CS_HREDRAW+CS_VREDRAW
    36. mov [_wc.lpfnWndProc], WindowProcess
    37. mov [_wc.cbClsExtra], 0
    38. mov [_wc.cbWndExtra], 0
    39. mov [_wc.hInstance], _mHandle
    40. mov [_wc.hIcon], _iHandle
    41. mov [_wc.hCursor], _cHandle
    42. mov [_wc.hbrBackground], COLOR_WINDOW
    43. mov [_wc.lpszMenuName], 0
    44. mov [_wc.lpszClassName], _cName
    45. invoke RegisterClass, _wc
    46.  
    47. ;===== создаём окно =====
    48.  
    49. invoke CreateWindowEx, 0, _cName, _wName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, [_mHandle], 0
    50. mov [_wHandle], eax
    51.  
    52. ;===== показываем и обновляем =====
    53.  
    54. invoke ShowWindow, [_wHandle], SW_SHOW
    55. invoke UpdateWindow, [_wHandle]
    56.  
    57. ;===== бесконечный цикл =====
    58.  
    59. .LOL:
    60. invoke GetMessage, _msg, 0, 0, 0
    61. cmp eax, 0
    62. je .exit
    63. invoke TranslateMessage, _msg
    64. invoke DispatchMessage, _msg
    65. jmp .LOL
    66.  
    67. .exit:
    68.  
    69. invoke ExitProcess, [_msg.wParam]
    70.  
    71. proc WindowProcess wHandle, msg, wparam, lparam
    72.  
    73. cmp [msg], WM_DESTROY
    74. je .destroy
    75. invoke DefWindowProc, [wHandle], [msg], [wparam], [lparam]
    76. jmp @ret
    77.  
    78. .destroy:
    79.  
    80. invoke PostQuitMessage, 0
    81. @ret:
    82. ret
    83. endp
    84.  
    85. section 'idata' import data readable
    86.  
    87.     library kernel32, 'KERNEL32.DLL', user32, 'USER32.DLL', gdi32, 'GDI32.DLL'
    88.  
    89.     include 'include\api\kernel32.inc'
    90.     include 'include\api\user32.inc'
    91.     include 'include\api\gdi32.inc'
     
  18. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    Это значит что fasm не может записать в exe файл данные. Т.е. этот exe в памяти висит. Ctrl+Alt+Del и убей процесс.
     
  19. Loginanton

    Loginanton New Member

    Публикаций:
    0
    Регистрация:
    8 май 2008
    Сообщения:
    74
    twgt точняк :) а я пытался после того как убил несколько прахов, висящих в памяти, просто запустить prax.exe снова :) Спасибо большое за помощь!

    P.S. прога действительно работает! Правда с курсором чё то не то


    А вот такой вопрос:
    будет ли разница между
    Код (Text):
    1. _wName TCHAR 'My Window :D',0
    и
    Код (Text):
    1. _wName db 'My Window :D',0
     
  20. zet

    zet New Member

    Публикаций:
    0
    Регистрация:
    15 окт 2007
    Сообщения:
    121
    Будет если заменить include 'include\win32a.inc' на include 'include\win32w.inc'