Секция ресурсов (FASM)

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

  1. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Пишу прогу, ресурсы так:
    Код (Text):
    1. data    resource
    2. ...
    3. end data
    При некоторых исправлениях в коде заметил, что пропадает меню главного окна (GetLastError (LoadMenu (0, IDR_MAINMENU)) = ERROR_INVALID_DATA). ResHacker также отказывается открывать меню. Однако если писать
    Код (Text):
    1. section '.rsrc' resource data readable
    проблема исчезает.

    Отчего бы это?

    Еще про fixups отмечу
    Код (Text):
    1. data    fixups
    2. end data
    или
    Код (Text):
    1. section '.fixups' fixups data readable
    => не компилируется такой код:

    Код (Text):
    1. macro   mov op1*, op2*
    2. {
    3.     if op1 eqtype ptr & op2 eqtype ptr
    4.         push    op2
    5.         pop     op1
    6.     else if (op1 eqtype eax & op2 eqtype 0) & (op2 <= 0x7F & op2 >= -0x80)
    7.         push    op2
    8.         pop     op1
    9.     else
    10.         mov     op1, op2
    11.     end if
    12. }
    13.  
    14. mov eax, hMainWnd ; глобальная переменная
    В exe файле это никчему, но все же?
     
  2. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Нужно выравнивать ресурсы.
     
  3. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    mov eax, [hMainWnd]
    не путайте fasm с masm'ом
     
  4. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Asterix
    Мне нужно было взять именно адрес.
     
  5. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    KeSqueer
    тогда выкладывайте пример где этот код не компилируется
     
  6. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Код (Text):
    1. format pe gui 4.0 ; dll
    2.  
    3. macro   mov op1*, op2*
    4. {
    5.     if op1 eqtype ptr & op2 eqtype ptr
    6.         push    op2
    7.         pop     op1
    8.     else if (op1 eqtype eax & op2 eqtype 0) & (op2 <= 0x7F & op2 >= -0x80)
    9.         push    op2
    10.         pop     op1
    11.     else
    12.         mov     op1, op2
    13.     end if
    14. }
    15.  
    16. section '.data' data readable writeable
    17.  
    18.         hMainWnd        dd ?
    19.  
    20. section '.text' code readable executable
    21.  
    22. entry $
    23.         mov     eax, hMainWnd
    24.         ret
    25.  
    26. section '.fixups' fixups data readable
    ;fasm 1.67.23
     
  7. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    KeSqueer
    А что должно означать "(op2 <= 0x7F & op2 >= -0x80)"?
     
  8. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    у меня все нормально
    Код (Text):
    1. format pe gui 4.0 ; dll
    2.  
    3. include     '%fasminc%\win32a.inc'
    4.  
    5. section '.data' data readable writeable
    6.  
    7.         hMainWnd        dd ?
    8.  
    9. section '.text' code readable executable
    10.  
    11. entry $
    12.         mov     eax, hMainWnd
    13.         ret
    14.  
    15. section '.fixups' fixups data readable
     
  9. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    IceStudent
    push imm
    pop reg если -0x80 <= imm <= 0x7f - три байта

    mov reg, imm - 5 байтов, если не ошибаюсь

    Asterix
    с макросом работает?
     
  10. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Нет, но причем здесь кривой макрос?
     
  11. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Asterix
    Вот и я думаю. При чем тут макрос? Без секции fixups все нормально.
     
  12. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    у меня и без этой секции с вашим макросом не компилируется, так что не понятно что у вас нормально
     
  13. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    ХЗ короче. Ладно, забью.
     
  14. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    IceStudent
    По какой границе?
     
  15. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    KeSqueer
    Ээ, ты с чего взял, что аргумент макроса - машинный код? Смотри win32ax.inc, макрос pushd для примера определения кода инструкции.

    Точно не скажу, подбери экспериментально.
     
  16. dr_dred

    dr_dred Сергей

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    301
    Адрес:
    Russia
    IceStudent
    Почему код? Просто число, типа mov eax, TRUE. Но посмотрю сейчас.
    ---
    Посмотрел, ничего не понял :dntknw: В макросах я не силен.
     
  17. Asterix

    Asterix New Member

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

    вот например в случае если в файле одна секция
    Код (Text):
    1. format PE GUI 4.0
    2. entry start
    3.  
    4. include '%fasminc%\win32a.inc'
    5.  
    6. IDC_EXIT   = 100
    7. HTCAPTION  =   2
    8.  
    9. macro WM_CASE reg, [msg]
    10. {
    11.   forward
    12.     cmp reg, WM_#msg
    13.     je .#msg
    14. }
    15.  
    16.  
    17. section '.rsrc' code readable writeable executable
    18.  
    19. data resource
    20.  
    21.  ; resource directory
    22.   directory RT_DIALOG,dialogs,\
    23.             RT_ICON, icons,\
    24.             RT_GROUP_ICON, group_icons
    25.  
    26.  ; resource subdirectories
    27.   resource dialogs,\
    28.            200, LANG_ENGLISH+SUBLANG_DEFAULT, main_dialog
    29.   resource icons,\
    30.            1, LANG_NEUTRAL, icon_data
    31.  
    32.   resource group_icons,\
    33.            400, LANG_NEUTRAL, main_icon
    34.  
    35.   dialog main_dialog,'Test',0,0,164,140,DS_MODALFRAME+DS_CENTER+WS_POPUP+WS_VISIBLE+WS_CAPTION+WS_SYSMENU,\
    36.                                         WS_EX_DLGMODALFRAME, ,'Tahoma',8
    37.     dialogitem 'BUTTON','Exit',IDC_EXIT,115,120,42,14,WS_VISIBLE+WS_TABSTOP+BS_DEFPUSHBUTTON
    38.   enddialog
    39.  
    40.   icon main_icon, icon_data, 'ida.ico'
    41.  
    42. end data
    43.  
    44. align 4
    45. proc DlgProc, hDlg, uMsg, wParam, lParam
    46.     mov eax, [uMsg]
    47.     WM_CASE eax, INITDIALOG, COMMAND, CLOSE, LBUTTONDOWN
    48. .r0:
    49.     xor eax, eax
    50.     jmp .return
    51. .INITDIALOG:
    52.     invoke LoadIcon, [hInstance], 400
    53.     invoke SendMessage, [hDlg], WM_SETICON, ICON_BIG, eax
    54.     jmp .r1
    55. .COMMAND:
    56.     mov eax, [wParam]
    57.     cmp ax, IDCANCEL
    58.     je .exit
    59.     cmp ax, IDC_EXIT
    60.     jne .r0
    61. .exit:
    62.     invoke SendMessage, [hDlg], WM_CLOSE, 0, 0
    63.     jmp .r1
    64. .LBUTTONDOWN:
    65.     invoke SendMessage, [hDlg], WM_NCLBUTTONDOWN, HTCAPTION, [lParam]
    66.     jmp .r1
    67. .CLOSE:
    68.     invoke EndDialog, [hDlg], 0
    69. .r1:
    70.     xor eax, eax
    71.     inc eax
    72. .return:
    73.     ret
    74. endp
    75.  
    76. start:
    77.     invoke GetModuleHandle, NULL
    78.     mov [hInstance], eax
    79.     invoke DialogBoxParam, eax, 200, 0, DlgProc, 0
    80.     invoke ExitProcess, 0
    81.  
    82. hInstance       dd  ?
    83.  
    84. data import
    85.  
    86. library kernel32,'KERNEL32.DLL',\
    87.         user32,'USER32.DLL'
    88.  
    89. include '%fasminc%\APIA\KERNEL32.INC'
    90. include '%fasminc%\APIA\USER32.INC'
    91.  
    92. end data
     
  18. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Asterix
    Понятно.
     
  19. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    dr_dred
    Что ты имеешь ввиду под "просто числом" в контексте "mov eax,TRUE"?
     
  20. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    TRUE=1 - число
    mov eax, hWnd
    именно hWnd, а не [hWnd], т.е. берем адрес hWnd. Это же число (адрес)?