|
|
| Посл.отвђт | Сообщен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 |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.185 |