Пишу прогу, ресурсы так: Код (Text): data resource ... end data При некоторых исправлениях в коде заметил, что пропадает меню главного окна (GetLastError (LoadMenu (0, IDR_MAINMENU)) = ERROR_INVALID_DATA). ResHacker также отказывается открывать меню. Однако если писать Код (Text): section '.rsrc' resource data readable проблема исчезает. Отчего бы это? Еще про fixups отмечу Код (Text): data fixups end data или Код (Text): section '.fixups' fixups data readable => не компилируется такой код: Код (Text): macro mov op1*, op2* { if op1 eqtype ptr & op2 eqtype ptr push op2 pop op1 else if (op1 eqtype eax & op2 eqtype 0) & (op2 <= 0x7F & op2 >= -0x80) push op2 pop op1 else mov op1, op2 end if } mov eax, hMainWnd ; глобальная переменная В exe файле это никчему, но все же?
Код (Text): format pe gui 4.0 ; dll macro mov op1*, op2* { if op1 eqtype ptr & op2 eqtype ptr push op2 pop op1 else if (op1 eqtype eax & op2 eqtype 0) & (op2 <= 0x7F & op2 >= -0x80) push op2 pop op1 else mov op1, op2 end if } section '.data' data readable writeable hMainWnd dd ? section '.text' code readable executable entry $ mov eax, hMainWnd ret section '.fixups' fixups data readable ;fasm 1.67.23
у меня все нормально Код (Text): format pe gui 4.0 ; dll include '%fasminc%\win32a.inc' section '.data' data readable writeable hMainWnd dd ? section '.text' code readable executable entry $ mov eax, hMainWnd ret section '.fixups' fixups data readable
IceStudent push imm pop reg если -0x80 <= imm <= 0x7f - три байта mov reg, imm - 5 байтов, если не ошибаюсь Asterix с макросом работает?
KeSqueer Ээ, ты с чего взял, что аргумент макроса - машинный код? Смотри win32ax.inc, макрос pushd для примера определения кода инструкции. Точно не скажу, подбери экспериментально.
IceStudent Почему код? Просто число, типа mov eax, TRUE. Но посмотрю сейчас. --- Посмотрел, ничего не понял В макросах я не силен.
ресурсы должны лежать строго в начале секции .rsrc вот например в случае если в файле одна секция Код (Text): format PE GUI 4.0 entry start include '%fasminc%\win32a.inc' IDC_EXIT = 100 HTCAPTION = 2 macro WM_CASE reg, [msg] { forward cmp reg, WM_#msg je .#msg } section '.rsrc' code readable writeable executable data resource ; resource directory directory RT_DIALOG,dialogs,\ RT_ICON, icons,\ RT_GROUP_ICON, group_icons ; resource subdirectories resource dialogs,\ 200, LANG_ENGLISH+SUBLANG_DEFAULT, main_dialog resource icons,\ 1, LANG_NEUTRAL, icon_data resource group_icons,\ 400, LANG_NEUTRAL, main_icon dialog main_dialog,'Test',0,0,164,140,DS_MODALFRAME+DS_CENTER+WS_POPUP+WS_VISIBLE+WS_CAPTION+WS_SYSMENU,\ WS_EX_DLGMODALFRAME, ,'Tahoma',8 dialogitem 'BUTTON','Exit',IDC_EXIT,115,120,42,14,WS_VISIBLE+WS_TABSTOP+BS_DEFPUSHBUTTON enddialog icon main_icon, icon_data, 'ida.ico' end data align 4 proc DlgProc, hDlg, uMsg, wParam, lParam mov eax, [uMsg] WM_CASE eax, INITDIALOG, COMMAND, CLOSE, LBUTTONDOWN .r0: xor eax, eax jmp .return .INITDIALOG: invoke LoadIcon, [hInstance], 400 invoke SendMessage, [hDlg], WM_SETICON, ICON_BIG, eax jmp .r1 .COMMAND: mov eax, [wParam] cmp ax, IDCANCEL je .exit cmp ax, IDC_EXIT jne .r0 .exit: invoke SendMessage, [hDlg], WM_CLOSE, 0, 0 jmp .r1 .LBUTTONDOWN: invoke SendMessage, [hDlg], WM_NCLBUTTONDOWN, HTCAPTION, [lParam] jmp .r1 .CLOSE: invoke EndDialog, [hDlg], 0 .r1: xor eax, eax inc eax .return: ret endp start: invoke GetModuleHandle, NULL mov [hInstance], eax invoke DialogBoxParam, eax, 200, 0, DlgProc, 0 invoke ExitProcess, 0 hInstance dd ? data import library kernel32,'KERNEL32.DLL',\ user32,'USER32.DLL' include '%fasminc%\APIA\KERNEL32.INC' include '%fasminc%\APIA\USER32.INC' end data