Уменьшение размера в МАСМ

Тема в разделе "WASM.ASSEMBLER", создана пользователем Caesarus, 9 дек 2004.

  1. koderr

    koderr New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2006
    Сообщения:
    205
    Mikl_
    Как я делаю DlgTemplate:
    Создаю диалог обычным способом (в rc), потом компилю, пишу маленькую программку, в ней делаю FindResource - LoadResource - GetSizeOfResource - пишу в файл - в хексах загоняю.

    Думаю, с меню можно аналогично проделать.
     
  2. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    koderr
    Ух, ты!!! Просто, как всё гениальное! Но ведь получается, что ты перетаскиваешь секцию ресурсов с конца файла в его начало и выигрыша по размеру здесь никакого. Там ведь наверняка есть поля о назначении которых можно только догадываться, помнишь о "Печати Баала"? Нули для выравнивания ресурсов между собой, уникод, который можно получать из ASCII-символов либо при помощи макроса либо при помощи MultiByteToWideChar. Кстати, интересно какой редактор ресурсов создает наименьший код rc, brcc или fasm? Чудная вещь есть в masm32/include/dialogs.inc. И ещё один вопрос, а можно ли через Template встроить меню в окно, а не в диалог?
     
  3. koderr

    koderr New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2006
    Сообщения:
    205
    Mikl_
    Не всю секцию, а только диалог. Т.е. кое-какой выигрыш все же есть)
    не знаю :)
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    влом читать тему полностью :)
    опции линкера для компактной программы (для ms link):
    /ALIGN:32 /DRIVER /MERGE:.rdata=.text /MERGE:.data=.text
    Для сишнега еще можно добавить /ENTRY:main msvcrt.lib /NODEFAULTLIB
     
  5. koderr

    koderr New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2006
    Сообщения:
    205
    Great
    Это все знают. Ты бы все-таки прочитал две страницы.
     
  6. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    Если тема еще кому-то интересна, взял стандартый шаблон оконного приложения из Iczelion туториала, сжал все что только мог. Получился exe размером 588 байт, работает под XP SP2 кто-нибудь сможет получить меньший размер? в аттаче exe
    Код (Text):
    1. .686P
    2. .model flat
    3. includelib user32.lib
    4. include windows.inc
    5. extern _imp__CreateWindowExA@48:dword
    6. extern _imp__DefWindowProcA@16:dword
    7. extern _imp__DispatchMessageA@4:dword
    8. extern _imp__GetMessageA@16:dword
    9. extern _imp__PostQuitMessage@4:dword
    10. extern _imp__RegisterClassA@4:dword
    11. .code
    12. start:  xchg ebx,eax
    13.     mov edi,offset style
    14.     assume edi:ptr WNDCLASSA
    15.     push edi
    16.     mov esi,offset _imp__RegisterClassA@4
    17.     call dword ptr [esi]
    18.     mov ecx,CW_USEDEFAULT
    19.     push ebx       
    20.     push [edi].hInstance
    21.     push ebx   
    22.     push ebx   
    23.     push ecx   
    24.     push ecx   
    25.     push ecx   
    26.     push ecx   
    27.     push WS_OVERLAPPEDWINDOW + WS_VISIBLE
    28.     push offset szWinTitle         
    29.     push [edi].lpszClassName
    30.     push ebx
    31.     call dword ptr [esi+4];_imp__CreateWindowExA@48 ;создать окно
    32.         add edi,sizeof WNDCLASSA;lea edi,msg
    33. message_loop: push ebx  ;цикл обработки сообщений
    34.     push ebx
    35.     push ebx
    36.     push edi
    37.     call dword ptr [esi+10h];_imp__GetMessageA@16  
    38.     xchg eax,ecx
    39.     jecxz short exit_msg_loop
    40.     push edi
    41.     call dword ptr [esi+0Ch];_imp__DispatchMessageA@4     ;вернуть управление Windows        
    42.     jmp short message_loop
    43. exit_msg_loop: ret
    44. WndProc proc ;hwnd:DWORD, Msg:DWORD, wParam:DWORD, lParam:DWORD
    45.     mov esi,offset _imp__RegisterClassA@4
    46.         cmp dword ptr [esp+8],WM_DESTROY;cmp Msg,WM_DESTROY
    47.     je short @@WM_DESTROY
    48.         jmp dword ptr [esi+8];_imp__DefWindowProcA@16   ;все сообщения, не обрабатываемые в функции WndProc, направляются на обработку по умолчанию  
    49. @@WM_DESTROY: push 0    ;завершение программы
    50.     call dword ptr [esi+14h];_imp__PostQuitMessage@4   
    51.     retn 10h
    52. WndProc endp
    53. ;WNDCLASSA -----------------------------------------------
    54.     style           dd CS_HREDRAW or CS_VREDRAW; Стиль нашего окна
    55.     lpfnWndProc     dd WndProc;Адрес процедуры обработки событий
    56.     cbClsExtra      dd 0        ;Эта хрень нам не нужна
    57.     cbWndExtra      dd 0        ;и эта тоже
    58.     hInstance       dd 400000h  ;Адрес нашей проги в памяти (Windows всегда её грузит по этому адресу)
    59.     hIcon           dd 10003h   ;Иконка окна по умолчанию
    60.     hCursor         dd 10011h   ;Курсор окна по умолчанию (здесь указан ID обычной стрелки)
    61.     hbrBackground   dd COLOR_WINDOW+1   ;Фон нашего окна
    62.     lpszMenuName    dd 0        ;Меню у нас отсутствует
    63.     lpszClassName   dd szWinClass; Указатель на имя нашего класса
    64. ;----------------------------------------------------------
    65.     msg     MSG <>
    66.     szWinTitle  db  'Our First Window',0
    67.     szWinClass  db  'Mikl32',0  
    68. end start
     
  7. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    Уменьшил до 536 байт, неужели никто не поддержит? теоретический предел 97 байт. В аттаче exe
    1) App Name = Class Name
    2) после RegisterClass и CreateWindowEx к WNDCLASSA никто не обращается, поэтому использую место, которое структура занимала для MSG
    3) пользуюсь тем, что функции в Импорте расположены по ординалам и использую к ним косвенную адресацию
     
  8. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    Уменьшил до 340 байт отказавшись от импорта, сперва получаю адреса функций программой kernel.exe, затем вставляю адреса API функций, работает под XP SP2, но каждому придется настраивать под себя. В аттаче kernel.exe сам exe'шник и сорц к нему
    Продолжение темы здесь