· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.A&O —› Оптимизнутость

. 1 . 2 . >>

Посл.отвђт Сообщенiе


Дата: Июл 8, 2004 18:12:16

Иначе это не назовёшь , но буду рад если у кого-то найдёться время поучить меня (нас) технике оптимизации обычного кода (по размеру) . Например имеем 140 байт кода :
;===================================================================== ================
            .code
;===================================================================== ================
ti          dd      0,0,0,0,0,0,0,0,0,offset tt,0
tt          db      "Tooltips_class32",0
;====================================140============================== ================
ht          dd      0
start:      invoke  CreateWindowEx,0,addr tt,0,TTS_BALLOON,0,0,0,0,0,0,0,0
            mov     ht,eax
            invoke  SendMessage,ht,TTM_ADDTOOL,0,addr ti
            invoke  SendMessage,ht,TTM_SETTITLE,1,addr tt
            invoke  SendMessage,ht,TTM_TRACKACTIVATE,1,addr ti
            invoke  Sleep,1000
            invoke  ExitProcess,0
            invoke  InitCommonControls
;====================================140============================== ================
            end     start


495706284__mini.zip


Дата: Июл 8, 2004 18:14:09

Пока у меня кое-как получилось сэкономить только 48 байт
;=======================================92============================ ================
BE 20104000  start:  mov     esi,offset ti	 ; esi = offset ti (TOOLINFO)
33C0		     xor     eax,eax		 ; eax = 0 (нужно для win9x)
6A 08		     push    8			 ; 8 в стек
59		     pop     ecx		 ; 8 в ecx
50	     @@:     push    eax		 ; 0 в стек
E2 FD		     loop    @B 		 ; повторяем 8 раз
6A 40		     push    40h		 ; TTS_BALLOON в стек
50		     push    eax		 ; 0 в стек
FF76 24 	     push    dword ptr [esi+36]  ; offset "Tooltips_class32" в стек
50		     push    eax		 ; 0 в стек
FF15 18104000	     call    CreateWindowEx	 ; Создать окно ToolTip
8BE8		     mov     ebp,eax		 ; ebp = hwnd
8D3D 14104000	     lea     edi,SendMessage	 ; call dword ptr [edi] = call SendMessage
56		     push    esi		 ; offset TOOLINFO в стек
FF36		     push    [esi]		 ; 0 в стек
BB 04040000	     mov     ebx,404h		 ; ebx = 404h = TTM_ADDTOOL
53		     push    ebx		 ; TTM_ADDTOOL в стек
55		     push    ebp		 ; hwnd в стек
FF17		     call    dword ptr [edi]	 ; call SendMessage
FF76 24 	     push    dword ptr [esi+36]  ; offset "Tooltips_class32" в стек
6A 01		     push    1			 ; Info icon в стек
83C3 1C 	     add     ebx,1Ch		 ; ebx = 420h = TTM_SETTITLE
53		     push    ebx		 ; TTM_SETTITLE в стек
55		     push    ebp		 ; hwnd в стек
FF17		     call    dword ptr [edi]	 ; call SendMessage
56		     push    esi		 ; offset TOOLINFO в стек
6A 01		     push    1			 ; True в стек
83EB 0F 	     sub     ebx,0Fh		 ; ebx = 411h = TTM_TRACKACTIVATE
53		     push    ebx		 ; TTM_TRACKACTIVATE в стек
55		     push    ebp		 ; hwnd в стек
FF17		     call    dword ptr [edi]	 ; call SendMessage
68 E8030000	     push    3E8h		 ; 1000 ms
FF15 08104000	     call    Sleep		 ; спим
50		     push    eax		 ; 0 в стек
FF15 0C104000	     call    ExitProcess	 ; exit
FF15 00104000	     call    InitCommonControls  ; для comctl32.dll
;=======================================92============================================


_1020136401__optimini.zip


Дата: Июл 8, 2004 18:43:43

bogrus
"push 1" можно заменить на "push eax", т.к. в аккумуляторе лежит TRUE после TTM_SETTITLE.


Дата: Июл 8, 2004 18:56:06

mov ebx, SendMessage
и пошел
call ebx
делать, должно быть меньше


Дата: Июл 8, 2004 18:58:58 · Поправил: bogrus

Quantum +2 байта наши (после TTM_ADDTOOL eax=1 тоже)
masquer вылетает (ebx не сохраняеться) . Тьфу забыл поменять ebx и edi . Щаз попробую .
Размер аналогичный . Всё равно спасибо .


Дата: Июл 8, 2004 19:10:26

У меня три раза встречаеться такой участок :
push    ebx
push    ebp
call    dword ptr [edi]
Может его как-то оформить ?


Дата: Июл 8, 2004 20:42:14 · Поправил: Asterix

bogrus
> 6A 08 push 8 ; 8 в стек

Если заPUSHить 9-ть нулей то, вроде бы,
здесь(в ниже приведенном куске) push eax можно будет убрать ;-)
50     push    eax ; 0 в стек(убрать эту строку =)
FF15 0C104000     call    ExitProcess ; exit


Дата: Июл 8, 2004 20:51:09 · Поправил: bogrus

Asterix клёво ! +1

Я ещё байт нашёл : "push 3E8h" заменяю на "sub ebx,29h" и "push ebx" .
Итого 88 байт , если отвоевать ещё 18 , то можно утверждать , что обычный (сишный :) код можно сократить в два раза 8)


Дата: Июл 8, 2004 20:52:55

Это:
68 E8030000     push    3E8h ; 1000 ms


Заменить на это:
83EB 29        SUB EBX,29h
53             PUSH EBX


Дата: Июл 8, 2004 20:53:47

Гы, я опоздал, пока писАллллллллл :-)))


Дата: Июл 8, 2004 21:09:57

Вот этот кусок:
33C0           xor     eax,eax ; eax = 0 (нужно для win9x)
6A 08          push    8 ; 8 в стек
59             pop     ecx ; 8 в ecx
50     @@:     push    eax ; 0 в стек
E2 FD          loop    @B  ; повторяем 8 раз
6A 40          push    40h ; TTS_BALLOON в стек
50             push    eax ; 0 в стек
FF76 24       push    dword ptr [esi+36]  ; offset "Tooltips_class32" в стек
50            push    eax ; 0 в стек
FF15 18104000 call    CreateWindowEx ; Создать окно ToolTip


Я бы заменил на такой:
push 9
pop ecx
@@: push 0
loop @B
push    40h ; TTS_BALLOON в стек
push    ecx ; 0 в стек
push    dword ptr [esi+36]  ; offset "Tooltips_class32" в стек
push    ecx ; 0 в стек
call    CreateWindowEx


Итого ещё 1 байт отвоевали ;-)


Дата: Июл 8, 2004 21:40:31 · Поправил: Black_mirror

Надеюсь это теперь уже окончательный вариант:
format PE GUI
entry start

include '%fasminc%\win32a.inc'

TTS_BALLOON = 40h
TTM_ADDTOOL = 404h
TTM_SETTITLE = 420h
TTM_TRACKACTIVATE = 411h

;section '.code' code readable executable

z=InitCommonControls
;            call    [InitCommonControls]

section '.idata' import data readable writeable

library kernel,'KERNEL32.DLL',\
	user,'USER32.DLL',\
	comctl,'COMCTL32.DLL'

import	kernel,\
	ExitProcess,'ExitProcess',\
	Sleep,'Sleep'

import	user,\
	CreateWindowEx,'CreateWindowExA',\
	SendMessage,'SendMessageA'

import	comctl,\
	InitCommonControls,'InitCommonControls'

ti          dd      0,0,0,0,0,0,0,0,0,tt,0
tt          db      "Tooltips_class32",0

start:
            mov     edi,SendMessage     ; call dword ptr [edi] = call SendMessage  
            mov     esi,ti       ; esi = offset ti (TOOLINFO)
            xor     ebx,ebx             ; eax = 0 (нужно для win9x)
            push    9                   ; 8 в стек
            pop     ecx                 ; 8 в ecx
@@:         push    ebx                 ; 0 в стек
            loop    @B                  ; повторяем 8 раз
            push    40h                 ; TTS_BALLOON в стек
            push    ebx                 ; 0 в стек
            push    dword [esi+36]  ; offset "Tooltips_class32" в стек
            push    ebx                 ; 0 в стек
            call    [CreateWindowEx-SendMessage+edi]      ; Создать окно ToolTip


	    mov ecx,3E8h                ; 1000 ms
	    push ecx

            push    esi                 ; offset TOOLINFO в стек
            push    1                   ; True в стек
            add ecx,29h             ; ebx = 411h = TTM_TRACKACTIVATE
            push    ecx                 ; TTM_TRACKACTIVATE в стек
            push    eax                 ; hwnd в стек

            push    dword [esi+36]  ; offset "Tooltips_class32" в стек
            push    1                   ; Info icon в стек
            mov   cl,20h             ; ebx = 420h = TTM_SETTITLE
            push    ecx                 ; TTM_SETTITLE в стек
            push    eax                 ; hwnd в стек

            push    esi                 ; offset TOOLINFO в стек
            push    ebx               ; 0 в стек
            mov     cl,04h            ; ebx = 404h = TTM_ADDTOOL
            push    ecx                 ; TTM_ADDTOOL в стек
            push    eax                 ; hwnd в стек

            call    dword [edi]     ; call SendMessage

            call    dword [edi]     ; call SendMessage

            call    dword [edi]     ; call SendMessage

            call    [Sleep-SendMessage+edi]               ; спим
            call    [ExitProcess-SendMessage+edi]         ; exit


А вот листинг:
0040111E > BF 9B104000      MOV EDI,<&USER32.SendMessageA>
00401123   BE E1104000      MOV ESI,tt.004010E1
00401128   31DB             XOR EBX,EBX
0040112A   6A 09            PUSH 9
0040112C   59               POP ECX
0040112D   53               PUSH EBX
0040112E  ^E2 FD            LOOPD SHORT tt.0040112D
00401130   6A 40            PUSH 40
00401132   53               PUSH EBX
00401133   FF76 24          PUSH DWORD PTR DS:[ESI+24]
00401136   53               PUSH EBX
00401137   FF57 FC          CALL DWORD PTR DS:[EDI-4]
0040113A   B9 E8030000      MOV ECX,3E8
0040113F   51               PUSH ECX
00401140   56               PUSH ESI
00401141   6A 01            PUSH 1
00401143   83C1 29          ADD ECX,29
00401146   51               PUSH ECX
00401147   50               PUSH EAX
00401148   FF76 24          PUSH DWORD PTR DS:[ESI+24]
0040114B   6A 01            PUSH 1
0040114D   B1 20            MOV CL,20
0040114F   51               PUSH ECX
00401150   50               PUSH EAX
00401151   56               PUSH ESI
00401152   53               PUSH EBX
00401153   B1 04            MOV CL,4
00401155   51               PUSH ECX
00401156   50               PUSH EAX
00401157   FF17             CALL DWORD PTR DS:[EDI]
00401159   FF17             CALL DWORD PTR DS:[EDI]
0040115B   FF17             CALL DWORD PTR DS:[EDI]
0040115D   FF57 DE          CALL DWORD PTR DS:[EDI-22]
00401160   FF57 DA          CALL DWORD PTR DS:[EDI-26]
00401163   

Итого 69 байт получается.

PS:сообщение было исправлено в связи с уменьшением размера кода на 1 байт.
PS2: еще 1 байт минус.


Дата: Июл 8, 2004 22:17:44

„Надеюсь это теперь уже окончательный вариант: “

Отличный урок , как мне , то предостаточно . Будем переваривать .
з.ы. Я в лёгком шоке качаю фасм :)


Дата: Июл 8, 2004 23:50:13

Предлагаю не использовать ebx(экономим регистр ;-)

00401120 > BF 9B104000      MOV EDI,<&USER32.SendMessageA>
00401125   BE E1104000      MOV ESI,OPTIMIZ.004010E1
0040112A   6A 09            PUSH 9
0040112C   59               POP ECX
0040112D   6A 00            PUSH 0
0040112F  ^E2 FC            LOOPD SHORT OPTIMIZ.0040112D
00401131   6A 40            PUSH 40
00401133   51               PUSH ECX
00401134   FF76 24          PUSH DWORD PTR DS:[ESI+24]
00401137   51               PUSH ECX
00401138   FF57 FC          CALL DWORD PTR DS:[EDI-4]
0040113B   B9 E8030000      MOV ECX,3E8
00401140   51               PUSH ECX
00401141   56               PUSH ESI
00401142   6A 01            PUSH 1
00401144   83C1 29          ADD ECX,29
00401147   51               PUSH ECX
00401148   50               PUSH EAX
00401149   FF76 24          PUSH DWORD PTR DS:[ESI+24]
0040114C   6A 01            PUSH 1
0040114E   B1 20            MOV CL,20
00401150   51               PUSH ECX
00401151   50               PUSH EAX
00401152   56               PUSH ESI
00401153   6A 00            PUSH 0
00401155   B1 04            MOV CL,4
00401157   51               PUSH ECX
00401158   50               PUSH EAX
00401159   FF17             CALL DWORD PTR DS:[EDI]
0040115B   FF17             CALL DWORD PTR DS:[EDI]
0040115D   FF17             CALL DWORD PTR DS:[EDI]
0040115F   FF57 DE          CALL DWORD PTR DS:[EDI-22]
00401162   FF57 DA          CALL DWORD PTR DS:[EDI-26]


Дата: Июл 9, 2004 00:10:07

„Предлагаю не использовать ebx(экономим регистр ;-) “

Категорически не согласен! (экономим байт ;)
0040111E > BF 9B104000      MOV EDI,<&USER32.SendMessageA>
00401123   BE E1104000      MOV ESI,tt.004010E1
00401128   8B5E 24          MOV EBX,DWORD PTR DS:[ESI+24]
0040112B   6A 09            PUSH 9
0040112D   59               POP ECX
0040112E   6A 00            PUSH 0
00401130  ^E2 FC            LOOPD SHORT tt.0040112E
00401132   6A 40            PUSH 40
00401134   51               PUSH ECX
00401135   53               PUSH EBX
00401136   51               PUSH ECX
00401137   FF57 FC          CALL DWORD PTR DS:[EDI-4]
0040113A   B9 E8030000      MOV ECX,3E8
0040113F   51               PUSH ECX
00401140   56               PUSH ESI
00401141   6A 01            PUSH 1
00401143   83C1 29          ADD ECX,29
00401146   51               PUSH ECX
00401147   50               PUSH EAX
00401148   53               PUSH EBX
00401149   6A 01            PUSH 1
0040114B   B1 20            MOV CL,20
0040114D   51               PUSH ECX
0040114E   50               PUSH EAX
0040114F   56               PUSH ESI
00401150   6A 00            PUSH 0
00401152   B1 04            MOV CL,4
00401154   51               PUSH ECX
00401155   50               PUSH EAX
00401156   FF17             CALL DWORD PTR DS:[EDI]
00401158   FF17             CALL DWORD PTR DS:[EDI]
0040115A   FF17             CALL DWORD PTR DS:[EDI]
0040115C   FF57 DE          CALL DWORD PTR DS:[EDI-22]
0040115F   FF57 DA          CALL DWORD PTR DS:[EDI-26]
00401162   

. 1 . 2 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.185