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

Discussion in 'WASM.ASSEMBLER' started by Morskoivolk, Apr 3, 2007.

  1. Morskoivolk

    Morskoivolk New Member

    Blog Posts:
    0
    Joined:
    Jan 30, 2007
    Messages:
    85
    Интересно сможет ли кто нибудь уменьшить размер данной программы настолько насколько это возможно??? У меня она весит 4096 байт.
    Эй, гуру ассемблера, проявите себя, помогите пытливому человеку...

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

    Code (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

    Blog Posts:
    0
    Joined:
    Jan 30, 2007
    Messages:
    85
    вот моя аська:
    334-754-436

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

    asd New Member

    Blog Posts:
    0
    Joined:
    Mar 12, 2005
    Messages:
    952
    Location:
    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

    Blog Posts:
    0
    Joined:
    Jan 30, 2007
    Messages:
    85
    но ведь reg придется объявлять в сегменте данных как тип DWORD....это же дополнительно место занимает, или я не прав?
     
  5. twgt

    twgt New Member

    Blog Posts:
    0
    Joined:
    Jan 15, 2007
    Messages:
    1,494
    Писец короче тут.
    No comments
     
  6. sergh

    sergh New Member

    Blog Posts:
    0
    Joined:
    Aug 31, 2005
    Messages:
    128
    Location:
    rsdn
    reg это "любой регистр".
     
  7. green

    green New Member

    Blog Posts:
    0
    Joined:
    Jul 15, 2003
    Messages:
    1,217
    Location:
    Ukraine
    Morskoivolk
    Чрезвычайно увлекательная задача - оптимизировать асмовский код для GUI. :)
     
  8. asmfan

    asmfan New Member

    Blog Posts:
    0
    Joined:
    Jul 10, 2006
    Messages:
    1,004
    Location:
    Abaddon
    Всё как будто списано с учебника для начинающих. Пример субоптимальности налицо. (MOV EAX, 0). Даже компайлер-программа-не позволила б себе такого.
     
  9. afybc

    afybc New Member

    Blog Posts:
    0
    Joined:
    Jun 30, 2006
    Messages:
    73
    Я даже знаю как ты определил, что она весит 4 096 байт )))))))))))))))))))))
    Интересно, у кого будет весить меньше?))))
     
  10. maxdiver

    maxdiver Max

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

    Morskoivolk New Member

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

    orbb New Member

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

    green New Member

    Blog Posts:
    0
    Joined:
    Jul 15, 2003
    Messages:
    1,217
    Location:
    Ukraine
    Morskoivolk
    Ну какой смысл пытаться оптимизировать на асме код, состоящий из вызовов API? Шансов переплюнуть хороший компилятор (типа VC++) практически нет - ни по скорости, ни по размеру. Да и радости, IMHO, никакой... Разве что поучиться.

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

    Morskoivolk New Member

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

    rain New Member

    Blog Posts:
    0
    Joined:
    Apr 22, 2006
    Messages:
    976
    Слушай конечно всё это уже давно всеми избитые темы. Ознакомся что-ли с сайтом, разделом, неофиту, загляни в инструменты..
     
  16. Mikl_

    Mikl_ New Member

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

    MCNet New Member

    Blog Posts:
    0
    Joined:
    Nov 23, 2006
    Messages:
    74
    orbb
    Почём брал? ;)
     
  18. Booster

    Booster New Member

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

    spencer New Member

    Blog Posts:
    0
    Joined:
    Aug 15, 2005
    Messages:
    277
    orbb пиши еще.. я запринтскринил, вырезал и повесил на раб столе... шедевр! )
     
  20. green

    green New Member

    Blog Posts:
    0
    Joined:
    Jul 15, 2003
    Messages:
    1,217
    Location:
    Ukraine
    Booster
    На С++ можно писать без RTL. Я небольшие проги, как правило, так и пишу.
    Размер получается вполне "асмовский". :)