Состязание гуру. Кто меньше?

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

  1. Morskoivolk

    Morskoivolk New Member

    Публикаций:
    0
    Регистрация:
    30 янв 2007
    Сообщения:
    85
    Интересно сможет ли кто нибудь уменьшить размер данной программы настолько насколько это возможно??? У меня она весит 4096 байт.
    Эй, гуру ассемблера, проявите себя, помогите пытливому человеку...

    О проге:
    прога-генератор серийника для WinZip 9.0......но пока без процедуры генерации.....)))
    сначала была написана на чистом API в Дельфи....но 18 Кб мне показалось много....решил на ассемблере (MASM32). Начало впечатляет 4 Кб.....но можно ли еще меньше?))))

    Код (Text):
    1. .386P
    2. ; сплошная модель памяти
    3. .MODEL FLAT, stdcall
    4. ;====================================================
    5. ;константы
    6. ;====================================================
    7. WM_SETFONT        equ 30h
    8. BN_CLICKED        equ 0
    9. WM_COMMAND        equ 111h
    10. DEFAULT_CHARSET   equ 1
    11. OUT_DEFAULT_PRECIS equ 0
    12. CLIP_DEFAULT_PRECIS equ 0
    13. DEFAULT_QUALITY   equ 0
    14. DEFAULT_PITCH     equ 0
    15. WM_SETFOCUS       equ 7h
    16. WS_OVERLAPPED     equ 0h
    17. ; сообщение приходит при закрытии окна
    18. WM_DESTROY        equ 2
    19. ; сообщение приходит при создании окна
    20. WM_CREATE         equ 1
    21. WM_KEYDOWN        equ 100h
    22. SM_CXSCREEN       equ 0
    23. SM_CYSCREEN       equ 1
    24. ; сообщение, позволяющее послать элементу строку
    25. WM_SETTEXT        equ 0Ch
    26. ; сообщение, позволяющее получить строку
    27. WM_GETTEXT        equ 0Dh
    28. ; свойства окна
    29. CS_VREDRAW        equ 1h
    30. CS_HREDRAW        equ 2h
    31. CS_GLOBALCLASS    equ 4000h
    32. WS_TABSTOP        equ 10000h
    33. WS_SYSMENU        equ 50000h
    34. WS_OVERLAPPEDWINDOW    equ 000CF0000H
    35. CS_PARENTDC       equ 80h
    36. style             equ CS_PARENTDC
    37. BS_DEFPUSHBUTTON  equ 1h
    38. WS_VISIBLE        equ 10000000h
    39. WS_CHILD          equ 40000000h
    40. WS_BORDER         equ 800000h
    41. ES_AUTOHSCROLL    equ 80h
    42. WS_EX_CLIENTEDGE  equ 00000200h
    43. BS_TEXT           equ 0
    44. WINDOWSTYLE equ WS_OVERLAPPEDWINDOW
    45. STYLBTN equ WS_CHILD+BS_TEXT+WS_VISIBLE+WS_TABSTOP
    46. STYLEDT equ WS_CHILD+WS_VISIBLE+WS_BORDER+WS_TABSTOP+ES_AUTOHSCROLL
    47. STYLSTAT equ WS_CHILD+WS_VISIBLE+WS_EX_CLIENTEDGE
    48. ; идентификатор стандартной иконки
    49. IDI_APPLICATION   equ 32512
    50. IDI_WARNING       equ 32515
    51. ; идентификатор курсора
    52. IDC_ARROW         equ 32512
    53. ; режим показа окна - нормальный
    54. SW_SHOWNORMAL     equ 1
    55. COLOR_BTNFACE     equ 15
    56. ;====================================================
    57. ; прототипы внешних процедур
    58. ;====================================================
    59. EXTERN   SetFocus@4:NEAR
    60. EXTERN   SendMessageA@16:NEAR
    61. EXTERN   MessageBoxA@16: NEAR
    62. EXTERN   CreateWindowExA@48:NEAR
    63. EXTERN   DefWindowProcA@16:NEAR
    64. EXTERN   DispatchMessageA@4:NEAR
    65. EXTERN   ExitProcess@4:NEAR
    66. EXTERN   GetMessageA@16:NEAR
    67. EXTERN   GetModuleHandleA@4:NEAR
    68. EXTERN   LoadCursorA@8:NEAR
    69. EXTERN   LoadIconA@8:NEAR
    70. EXTERN   PostQuitMessage@4:NEAR
    71. EXTERN   RegisterClassA@4:NEAR
    72. EXTERN   ShowWindow@8:NEAR
    73. EXTERN   TranslateMessage@4:NEAR
    74. EXTERN   UpdateWindow@4:NEAR
    75. EXTERN   GetSystemMetrics@4:NEAR
    76. EXTERN   CreateFontIndirectA@4:NEAR
    77. EXTERN   SendMessageA@16:NEAR
    78. EXTERN   GetWindowTextLengthA@4:NEAR
    79. EXTERN   GetWindowTextLengthA@4:NEAR
    80.  
    81.  
    82. ;====================================================
    83. ; директивы компоновщику для подключения библиотек
    84. ;====================================================
    85. includelib i:\masm32\lib\user32.lib
    86. includelib i:\masm32\lib\kernel32.lib
    87. includelib i:\masm32\lib\gdi32.lib
    88. ;====================================================
    89. ; структуры
    90. ;====================================================
    91. ;
    92. ;--------------------
    93. ; структура сообщения
    94. ;--------------------
    95. MSGSTRUCT STRUC
    96.      MSHWND        DD   ? ; идентификатор окна,
    97.                           ; получающего сообщение
    98.      MSMESSAGE     DD   ? ; идентификатор сообщения
    99.      MSWPARAM      DD   ? ; доп. информация о сообщении
    100.      MSLPARAM      DD   ? ; доп. информация о сообщении
    101.      MSTIME        DD   ? ; время посылки сообщения
    102.      MSPT          DD   ? ; положение курсора, во время посылки
    103.                           ; сообщения
    104. MSGSTRUCT ENDS
    105.  
    106. ;--------------------
    107. ; структура окна
    108. ;--------------------
    109. WNDCLASS STRUC
    110.      CLSSTYLE      DD   ? ; стиль окна
    111.      CLWNDPROC     DD   ? ; указатель на процедуру окна
    112.      CLSCSEXTRA    DD   ? ; информация о доп. байтах для
    113.                           ; данной структуры
    114.      CLWNDEXTRA    DD   ? ; информация о доп. байтах для окна
    115.      CLSHINSTANCE  DD   ? ; дескриптор приложения
    116.      CLSHICON      DD   ? ; идентификатор иконы окна
    117.      CLSHCURSOR    DD   ? ; идентификатор курсора окна
    118.      CLBKGROUND    DD   ? ; идентификатор кисти окна
    119.      CLMENUNAME    DD   ? ; имя-идентификатор меню
    120.      CLNAME        DD   ? ; специфицирует имя класса окон
    121. WNDCLASS ENDS
    122.  
    123. ;--------------------
    124. ; структура шрифта
    125. ;--------------------
    126. LOGFONTA STRUCT
    127.   lfHeight          DWORD      ?
    128.   lfWidth           DWORD      ?
    129.   lfEscapement      DWORD      ?
    130.   lfOrientation     DWORD      ?
    131.   lfWeight          DWORD      ?
    132.   lfItalic          BYTE       ?
    133.   lfUnderline       BYTE       ?
    134.   lfStrikeOut       BYTE       ?
    135.   lfCharSet         BYTE       ?
    136.   lfOutPrecision    BYTE       ?
    137.   lfClipPrecision   BYTE       ?
    138.   lfQuality         BYTE       ?
    139.   lfPitchAndFamily  BYTE       ?
    140.   lfFaceName        BYTE       'MS Sans Serif',0
    141. LOGFONTA ENDS
    142.  
    143. ;====================================================
    144. ; сегмент данных
    145. ;====================================================
    146. _DATA  SEGMENT      DWORD PUBLIC USE32 'DATA'
    147.      NEWHWND       DD 0    
    148.      MSG           MSGSTRUCT <?>
    149.      WC            WNDCLASS  <?>
    150.      LG            LOGFONTA  <?>
    151.      HINST         DD 0 ; здесь хранится дескриптор приложения
    152.      TITLENAME     DB 'WinZip 9.0 SR-1 KeyGen',0
    153.      CLASSNAME     DB 'CLASS32',0
    154.      CPBUT         DB 'Generate',0 ; выход
    155.      CPEDT         DB ?
    156.      CPSTAT        DB 'Created by Morskoivolk ',0
    157.      CPSTAT1       DB 'Enter name:',0
    158.      CPSTAT2       DB 'Serial number:',0
    159.      CLSBUTN       DB 'BUTTON',0
    160.      CLSEDIT       DB 'EDIT',0
    161.      CLSSTAT       DB 'STATIC',0   
    162.      HWNDBTN       DWORD 0
    163.      HWNDEDT       DWORD 0
    164.      HWNDEDT1      DWORD 0
    165.      HWNDSTAT      DWORD 0
    166.      HWFONT        DWORD 0
    167.      HWFONT1     DWORD 0
    168.      W             DWORD 0
    169.      H             DWORD 0
    170.      X             DWORD 0
    171.      Y             DWORD 0
    172.      el_width      DWORD 0
    173.      Name_length   DWORD 0
    174.      str1          DB 'Внимание!!!',0
    175.      str2          DB 'Введите имя',0
    176.      str3          DB 'Минимальная длина имени - 6 символов',0    
    177.  
    178. _DATA ENDS
    179.  
    180.  
    181. ;====================================================
    182. ; сегмент кода
    183. ;====================================================
    184. _TEXT SEGMENT DWORD PUBLIC USE32 'CODE'
    185. START:
    186. ; получить дескриптор приложения
    187.      PUSH     0
    188.      CALL     GetModuleHandleA@4
    189.      MOV      [HINST], EAX
    190. REG_CLASS:
    191. ; заполнить структуру окна стиль
    192.      MOV [WC.CLSSTYLE], style
    193. ; процедура обработки сообщений
    194.      MOV [WC.CLWNDPROC], OFFSET WNDPROC
    195.      MOV [WC.CLSCSEXTRA], 0
    196.      MOV [WC.CLWNDEXTRA], 0
    197.      MOV EAX, [HINST]
    198.      MOV [WC.CLSHINSTANCE], EAX
    199. ;--------- иконка окна
    200.      PUSH 1
    201.      PUSH [HINST]
    202.      CALL LoadIconA@8
    203.      MOV  [WC.CLSHICON], EAX
    204. ;---------- курсор окна
    205.      PUSH IDC_ARROW
    206.      PUSH 0
    207.      CALL LoadCursorA@8
    208.      MOV  [WC.CLSHCURSOR], EAX
    209. ;---------
    210.      MOV  [WC.CLBKGROUND], COLOR_BTNFACE+1 ; цвет окна
    211.      MOV DWORD PTR [WC.CLMENUNAME], 0
    212.      MOV DWORD PTR [WC.CLNAME], OFFSET CLASSNAME
    213.      PUSH OFFSET WC
    214.      CALL RegisterClassA@4
    215.  
    216. ;Расположение окна приложения в центре экрана
    217.      mov W,190
    218.      mov H,195
    219.      
    220.      push SM_CXSCREEN
    221.      call GetSystemMetrics@4
    222.      PUSH EAX
    223.      PUSH W
    224.      call TOPXY    
    225.      mov X,eax
    226.  
    227.      push SM_CYSCREEN
    228.      call GetSystemMetrics@4
    229.      PUSH EAX
    230.      PUSH W
    231.      call TOPXY    
    232.      mov Y,eax
    233. ; создать окно зарегистрированного класса
    234.      PUSH 0
    235.      PUSH [HINST]
    236.      PUSH 0
    237.      PUSH 0
    238.      PUSH H ; DY — высота окна
    239.      PUSH W ; DX - ширина окна
    240.      PUSH Y ; Y — координата левого верхнего угла
    241.      PUSH X ; X — координата левого верхнего угла
    242.      PUSH OFFSET WINDOWSTYLE
    243.      PUSH OFFSET TITLENAME ; имя окна
    244.      PUSH OFFSET CLASSNAME ; имя класса
    245.      PUSH 0
    246.      CALL CreateWindowExA@48
    247. ; проверка на ошибку
    248.      ;CMP EAX, 0
    249.      ;JZ  _ERR
    250.      MOV [NEWHWND], EAX ; дескриптор окна
    251. ; --------------------------------------------------
    252.      PUSH SW_SHOWNORMAL
    253.      PUSH [NEWHWND]
    254.      CALL ShowWindow@8; показать созданное окно
    255. ; --------------------------------------------------
    256.      PUSH [NEWHWND]
    257.      CALL UpdateWindow@4  ; команда перерисовать видимую
    258.                           ; часть окна, сообщение WM_PAINT
    259. ; петля обработки сообщений
    260.  
    261.  
    262. MSG_LOOP:
    263.      PUSH 0
    264.      PUSH 0
    265.      PUSH 0
    266.      PUSH offset MSG
    267.      CALL GetMessageA@16
    268.      CMP EAX, 0
    269.      JE  END_LOOP
    270.      PUSH offset MSG
    271.      CALL TranslateMessage@4
    272.      PUSH offset MSG
    273.      CALL DispatchMessageA@4
    274.      JMP MSG_LOOP
    275.   END_LOOP:
    276. ;  выход из программы (закрыть процесс)
    277.       PUSH [MSG.MSWPARAM]
    278.       CALL ExitProcess@4
    279.  _ERR:
    280.       JMP END_LOOP
    281.  
    282.  
    283. ; --------------------------------------------------
    284. ; WARNING: Win32 requires that EBX, EDI, and ESI be preserved!  We comply
    285. ; with this by listing those regs after the 'uses' statement in the 'proc'
    286. ; line.  This allows the Assembler to save them for us.
    287. ; процедура окна
    288. ; расположение параметров в стеке
    289. ; [EBP+014H] LPARAM
    290. ; [EBP+10H] WAPARAM
    291. ; [EBP+0CH] MES
    292. ; [EBP+8] HWND
    293. WNDPROC  PROC
    294.  
    295.      PUSH EBP
    296.      MOV EBP, ESP
    297.      PUSH EBX
    298.      PUSH ESI
    299.      PUSH EDI
    300.      CMP DWORD PTR [EBP+0CH], WM_DESTROY
    301.      JE  WMDESTROY
    302.      CMP DWORD PTR [EBP+0CH], WM_CREATE
    303.      JE  WMCREATE
    304.      CMP DWORD PTR [EBP+10H], 100 ;если нажата кнопка 'Generete'
    305.      JE BNCLICKED
    306.  
    307.      JMP DEFWNDPROC
    308. WMCREATE:
    309. ;создание шрифта MS SANS SERIF
    310.      MOV lg.LfHeight,14   ; высота фонта 14
    311.      MOV lg.LfWidth, 0    ; ширина фонта
    312.      MOV lg.LfEscapement,900 ; ориентация
    313.      MOV lg.LfOrientation, 0 ; вертикальная
    314.      MOV lg.LfWeight,900   ; толщина линий шрифта
    315.      MOV lg.LfItalic, 0    ; курсив
    316.      MOV lg.LfUnderline, 0 ; подчеркивание
    317.      MOV lg.LfStrikeOut, 0 ; перечеркивание
    318.      MOV lg.LfCharSet, 0   ; набор шрифтов
    319.      MOV lg.LfOutPrecision, 0
    320.      MOV lg.LfClipPrecision, 0
    321.      MOV lg.LfQuality,2
    322.      MOV lg.LfPitchAndFamily,0    
    323.      PUSH OFFSET lg
    324.      CALL CreateFontIndirectA@4
    325.      mov HWFONT,EAX
    326.      MOV lg.LfHeight,15   ; высота фонта 15
    327.      MOV lg.LfWidth, 0    ; ширина фонта
    328.      MOV lg.LfEscapement,900 ; ориентация
    329.      MOV lg.LfOrientation, 0 ; вертикальная
    330.      MOV lg.LfWeight,0   ; толщина линий шрифта
    331.      MOV lg.LfItalic, 0    ; курсив
    332.      MOV lg.LfUnderline, 0 ; подчеркивание
    333.      MOV lg.LfStrikeOut, 0 ; перечеркивание
    334.      MOV lg.LfCharSet, 0   ; набор шрифтов
    335.      MOV lg.LfOutPrecision, 0
    336.      MOV lg.LfClipPrecision, 0
    337.      MOV lg.LfQuality,2
    338.      MOV lg.LfPitchAndFamily,0    
    339.      PUSH OFFSET lg
    340.      CALL CreateFontIndirectA@4
    341.      MOV HWFONT1,EAX
    342. ; создать окно-кнопку
    343.      mov EBX,W
    344.      MOV el_width,160
    345.      PUSH EBX
    346.      PUSH el_width
    347.      call TOPXY    
    348.      SUB EAX,4    ;это чтобы элемент располагался по центру окна
    349.      mov X,eax
    350.  
    351.      PUSH 0
    352.      PUSH [HINST]
    353.      PUSH 100
    354.      PUSH DWORD PTR [EBP+08H]
    355.      PUSH 24   ; DY
    356.      PUSH el_width       ; DX
    357.      PUSH 125            ; Y
    358.      PUSH X              ; X
    359.      PUSH STYLBTN
    360.      PUSH OFFSET CPBUT   ; имя окна
    361.      PUSH OFFSET CLSBUTN ; имя класса
    362.      PUSH 0
    363.      CALL CreateWindowExA@48
    364.      MOV HWNDBTN, EAX    ; запомнить дескриптор кнопки
    365.      PUSH 0
    366.      PUSH HWFONT1
    367.      PUSH WM_SETFONT
    368.      PUSH HWNDBTN
    369.      CALL SendMessageA@16
    370.  
    371. ; создать компенент типа TStatic
    372.      PUSH 0
    373.      PUSH [HINST]
    374.      PUSH 0
    375.      PUSH DWORD PTR [EBP+08H]
    376.      PUSH 20   ; DY
    377.      PUSH 160  ; DX
    378.      PUSH 150   ; Y
    379.      PUSH 20   ; X
    380.      PUSH STYLSTAT
    381.      PUSH OFFSET  CPSTAT   ; имя окна
    382.      PUSH OFFSET CLSSTAT ; имя класса
    383.      PUSH 0
    384.      CALL CreateWindowExA@48
    385.      MOV  HWNDSTAT,EAX
    386.      PUSH 0
    387.      PUSH HWFONT1
    388.      PUSH WM_SETFONT
    389.      PUSH HWNDSTAT
    390.      CALL SendMessageA@16
    391. ;создать компенент типа TStatic_1
    392.      PUSH 0
    393.      PUSH [HINST]
    394.      PUSH 0
    395.      PUSH DWORD PTR [EBP+08H]
    396.      PUSH 20   ; DY
    397.      PUSH 160  ; DX
    398.      PUSH 2   ; Y
    399.      PUSH 7   ; X
    400.      PUSH STYLSTAT
    401.      PUSH OFFSET  CPSTAT1   ; имя окна
    402.      PUSH OFFSET CLSSTAT ; имя класса
    403.      PUSH 0
    404.      CALL CreateWindowExA@48
    405.      MOV HWNDSTAT,EAX
    406.      PUSH 0
    407.      PUSH HWFONT
    408.      PUSH WM_SETFONT
    409.      PUSH HWNDSTAT
    410.      CALL SendMessageA@16
    411.  
    412. ;создать компенент типа TStatic_2
    413.      PUSH 0
    414.      PUSH [HINST]
    415.      PUSH 0
    416.      PUSH DWORD PTR [EBP+08H]
    417.      PUSH 20   ; DY
    418.      PUSH 160  ; DX
    419.      PUSH 47   ; Y
    420.      PUSH 7   ; X
    421.      PUSH STYLSTAT
    422.      PUSH OFFSET  CPSTAT2   ; имя окна
    423.      PUSH OFFSET CLSSTAT ; имя класса
    424.      PUSH 0
    425.      CALL CreateWindowExA@48
    426.      MOV HWNDSTAT,EAX
    427.      PUSH 0
    428.      PUSH HWFONT
    429.      PUSH WM_SETFONT
    430.      PUSH HWNDSTAT
    431.      CALL SendMessageA@16
    432.  
    433. ; создать окно редактирования_1
    434.      mov EBX,W
    435.      MOV el_width,160
    436.      PUSH EBX
    437.      PUSH el_width
    438.      call TOPXY    
    439.      SUB EAX,4    
    440.      mov X,eax
    441.  
    442.      PUSH 0
    443.      PUSH [HINST]
    444.      PUSH 0
    445.      PUSH DWORD PTR [EBP+08H]
    446.      PUSH 23   ; DY
    447.      PUSH el_width ; DX
    448.      PUSH 20   ; Y
    449.      PUSH X   ; X
    450.      PUSH STYLEDT
    451.      PUSH OFFSET CPEDT   ; имя окна
    452.      PUSH OFFSET CLSEDIT ; имя класса
    453.      PUSH WS_EX_CLIENTEDGE  
    454.      CALL CreateWindowExA@48
    455.      MOV HWNDEDT,EAX
    456.      PUSH 0
    457.      PUSH HWFONT1
    458.      PUSH WM_SETFONT
    459.      PUSH HWNDEDT
    460.      CALL SendMessageA@16
    461.  
    462. ;--------- установить фокус на окне редактирования
    463.      PUSH HWNDEDT
    464.      CALL SetFocus@4
    465. ; создать окно редактирования_2
    466.      mov EBX,W
    467.      MOV el_width,160
    468.      PUSH EBX
    469.      PUSH el_width
    470.      call TOPXY    
    471.      SUB EAX,4    
    472.      mov X,eax
    473.  
    474.      PUSH 0
    475.      PUSH [HINST]
    476.      PUSH 0
    477.      PUSH DWORD PTR [EBP+08H]
    478.      PUSH 23   ; DY
    479.      PUSH el_width ; DX
    480.      PUSH 65   ; Y
    481.      PUSH X    ; X
    482.      PUSH STYLEDT
    483.      PUSH OFFSET CPEDT   ; имя окна
    484.      PUSH OFFSET CLSEDIT ; имя класса
    485.      PUSH WS_EX_CLIENTEDGE
    486.      CALL CreateWindowExA@48
    487.      MOV HWNDEDT1,EAX
    488.      PUSH 0
    489.      PUSH HWFONT1
    490.      PUSH WM_SETFONT
    491.      PUSH HWNDEDT1
    492.      CALL SendMessageA@16
    493.      MOV EAX, 0
    494.      JMP FINISH
    495.  
    496. DEFWNDPROC:
    497.      PUSH DWORD PTR [EBP+14H]
    498.      PUSH DWORD PTR [EBP+10H]
    499.      PUSH DWORD PTR [EBP+0CH]
    500.      PUSH DWORD PTR [EBP+08H]
    501.      CALL DefWindowProcA@16
    502.      JMP FINISH
    503.  
    504. BNCLICKED:
    505.      PUSH HWNDEDT
    506.      call GetWindowTextLengthA@4 ;считает количество символов во введенном тексте
    507. .if  EAX==0            ;если количество символов 0, то  
    508.      call EnterName    ;вывод сообщения....
    509. .elseif EAX<6          ;если количество символов < 6, то
    510.      call MinLength    ;вывод сообщения....
    511. .endif
    512.      JMP FINISH
    513.  
    514. WMDESTROY:
    515.      PUSH 0
    516.      CALL PostQuitMessage@4 ; сообщение WM_QUIT
    517.      MOV EAX, 0
    518.  
    519. FINISH:
    520.      POP EDI
    521.      POP ESI
    522.      POP EBX
    523.      POP EBP
    524.      RET 16
    525. WNDPROC ENDP
    526.  
    527. ;------------------------------------------------------------
    528. TopXY proc wDim:DWORD, sDim:DWORD ;процедура,центрирующая окно приложения
    529.      shr sDim,1
    530.      shr wDim,1
    531.      mov eax,wDim
    532.      sub sDim,eax
    533.      mov eax,SDim
    534.      ret
    535. TopXY endp
    536. ;===========================================================
    537. ;процедуры вывода сообщения о некорректном вводе информации
    538. ;===========================================================
    539. EnterName proc  
    540.      push 0
    541.      push offset str1
    542.      push offset str2
    543.      push NEWHWND
    544.      call MessageBoxA@16    
    545.      RET
    546. EnterName endp    
    547.  
    548. MinLength proc    
    549.      push 0
    550.      push offset str1
    551.      push offset str3
    552.      push NEWHWND
    553.      call MessageBoxA@16
    554.      RET
    555. MinLength endp
    556. ;===========================================================
    557.  
    558.  
    559. _TEXT ENDS
    560. END START
     
  2. Morskoivolk

    Morskoivolk New Member

    Публикаций:
    0
    Регистрация:
    30 янв 2007
    Сообщения:
    85
    вот моя аська:
    334-754-436

    если что надумаете стучите, буду только рад!
     
  3. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    :) круто. 4 кб кода нейзвестно зачем писать.


    PUSH 0
    PUSH [HINST]
    PUSH 0
    PUSH 0
    PUSH H ; DY — высота окна
    PUSH W ; DX - ширина окна
    PUSH Y ; Y — координата левого верхнего угла
    PUSH X ; X — координата левого верхнего угла
    PUSH OFFSET WINDOWSTYLE
    PUSH OFFSET TITLENAME ; имя окна
    PUSH OFFSET CLASSNAME ; имя класса
    PUSH 0
    CALL CreateWindowExA@48

    Замени все
    push 0
    на
    xor reg,reg
    push reg

    уже меньше будет
     
  4. Morskoivolk

    Morskoivolk New Member

    Публикаций:
    0
    Регистрация:
    30 янв 2007
    Сообщения:
    85
    но ведь reg придется объявлять в сегменте данных как тип DWORD....это же дополнительно место занимает, или я не прав?
     
  5. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    Писец короче тут.
    No comments
     
  6. sergh

    sergh New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    128
    Адрес:
    rsdn
    reg это "любой регистр".
     
  7. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    Morskoivolk
    Чрезвычайно увлекательная задача - оптимизировать асмовский код для GUI. :)
     
  8. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    Всё как будто списано с учебника для начинающих. Пример субоптимальности налицо. (MOV EAX, 0). Даже компайлер-программа-не позволила б себе такого.
     
  9. afybc

    afybc New Member

    Публикаций:
    0
    Регистрация:
    30 июн 2006
    Сообщения:
    73
    Я даже знаю как ты определил, что она весит 4 096 байт )))))))))))))))))))))
    Интересно, у кого будет весить меньше?))))
     
  10. maxdiver

    maxdiver Max

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    308
    Адрес:
    Саратов
    Если откомпилировать этот же код с опцией ALIGN:4, то размер exe-шника уже уменьшится до 2.9 КБ :)
    А по поводу оптимизации:
    1) естественно, заменить всякие mov X, 0 и push 0
    2) код, который создает окно (особенно контролы), почти одинаковый - его лучше выделить в отдельную процедуру.
     
  11. Morskoivolk

    Morskoivolk New Member

    Публикаций:
    0
    Регистрация:
    30 янв 2007
    Сообщения:
    85
    я тока постигаю Ассм....поэтому не надо так категорично , вспомните себя....)))
    ужасно хочется писать на ассме не просто проги, а действительно хорошие приложения (небольшие).
    так что не вижу ничего страшного что основа примера была взята из тупых банальных учебников, которые не всегда хорошие и понятные,....но все таки с чего то надо начинать.
    Так что прошу побольше замечаний делать по теме, а не ходить вокруг да около и высмеивать, то с чего вы начинали сами...
     
  12. orbb

    orbb New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2007
    Сообщения:
    16
    у отстрелянов процесоров интела проблем оптимизации ето проблем мира.у хорошие процесоров таких проблемов не стоит - у они хардуер поимает и придуман работои с очен долгих слов исполнят команди на асемблере високом уровне ,там не нужно такая плохая ос как вин где с C++ заменяется нужние хардуерние команди .потом и ос написана плохо.Интелские консерви не смогут 2 чисел собираут без ошибки а как надеятся на их въичислит кодов и другие ? Система командов неортогоналная и плохая, морално и психо остарела как бабушка у асм програмированиу. 4 регистер не достато4ни дори у треторазряднъих компутеров , у новъих добавлени 32 хахахахахах, у Атмела 8 бит имеет 256 из 6 года назад ихаааааааааа.я у моем микропроцесорнъх систем пуш и поп никогда не ползовал,и регистри не сохранял в лудост как туда. мои девиз - стреляи у интел и маикрософта.
     
  13. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    Morskoivolk
    Ну какой смысл пытаться оптимизировать на асме код, состоящий из вызовов API? Шансов переплюнуть хороший компилятор (типа VC++) практически нет - ни по скорости, ни по размеру. Да и радости, IMHO, никакой... Разве что поучиться.

    Вот процедура генерации серийника - другое дело.
     
  14. Morskoivolk

    Morskoivolk New Member

    Публикаций:
    0
    Регистрация:
    30 янв 2007
    Сообщения:
    85
    вот именно поучиться и хочется, чтобы в дальнейшем не грузить голову по этому поводу.
    процедура генерации серийника.....не сказал бы что там уж много наоптимизируешь....хотя если она большая, и много в ней всякой лажи..то конечно.
    в любом случае, неужели ни у кого не возникала идея написать своего рода шапку, к примеру, для окна с двумя полями ввода, кнопкой парой статических элементов, оптимизировать ее скажем до 1 Кб.......а в адльнейшем просто навешивать свои процедуры и функции...например ту же процедуру генерации серийника. Ведь зачем каждый раз тратить силы на уменьшение размера всей программы, когда можно оптимизировать только отдельные пользовательские процедуры?
     
  15. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    Слушай конечно всё это уже давно всеми избитые темы. Ознакомся что-ли с сайтом, разделом, неофиту, загляни в инструменты..
     
  16. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    Morskoivolk
    тебе уже отвечали, что конкретно читать в твоем предыдущем посте
    как под структуру типа MSG выделить строго определенное количество байт
    даже если твой исходник прогнать через переделанный PoLink (как, читай сам) размер exe упададет с 4к до 2,5к, а твой код еще оптимизировать и оптимизировать, только делай это сам, минимальный размер PE-файла 97 байт, стремись к этому! А Edit'ы, кнопки, статический текст сделать через редактор ресурсов не судьба видимо? ;)
    orbb
    Это сербский или болгарский язык?
     
  17. MCNet

    MCNet New Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2006
    Сообщения:
    74
    orbb
    Почём брал? ;)
     
  18. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    green
    А rtl как же. Можно конечно сделать свой rtl, но этож гемор, да и то нет гарантий что прокатит.
    Лично я маленькие гуёвые проги пишу именно на асме. Нафига мне лишние 50-100кб, скорость разработки конечно немного увеличивается, но чтож делать за всё надо платить.
    С другой стороны сильно уменьшать размер (до 1-2 кб) тоже смысла не вижу, выравнивание не просто так сделано.
     
  19. spencer

    spencer New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2005
    Сообщения:
    277
    orbb пиши еще.. я запринтскринил, вырезал и повесил на раб столе... шедевр! )
     
  20. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    Booster
    На С++ можно писать без RTL. Я небольшие проги, как правило, так и пишу.
    Размер получается вполне "асмовский". :)