|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Авг 6, 2003 04:53:56 KiNDeR оптимизировать нужно осторожно ;-) Теперь в твоей программе появился новый глюк, если запускать через command.com без параметров, т.е. только имя файла и всё, то MessageBox приходит не пустой, а с символом '|'. |
|
|
Дата: Авг 6, 2003 04:55:36 [ KiNDeR Вообще-то в обработчиках строк ценится не размер кода, а скорость его выполнения. Так что будем оптимизировать...] Вот только как проверить скорость выполнения? |
|
|
Дата: Авг 6, 2003 04:55:39 · Поправил: KiNDeR Asterix А ты передвинь метку cmdline_empty: на 4 строки вверх. И все... Измерить можно с помощью команды RDTSC, но пользоваться ей я не умею.... |
|
|
Дата: Авг 6, 2003 05:27:56 Проделал такой эксперимент загружаю прогу в SoftIce через Symbol Loader, стопорюсь на EP, затем ставлю бряк на адрес call MessageBoxA, для каждой проги проделал по три раза и посчитал среднее арифметическое. Результаты: KiNDeR-206.46 микро-секунд(и прога опять пишет в MessageBox кракозяблики) Asterix-181.88 микро-секунды p.s. я передвинул... |
|
|
Дата: Авг 6, 2003 05:59:31 · Поправил: Quantumstart: invoke GetCommandLine xor ecx,ecx parser: inc eax cmp WORD PTR [eax],2F20h ; " /" je found cmp BYTE PTR [eax],cl jne parser found: invoke MessageBox,ecx,eax,ecx,ecx invoke ExitProcess,eax end startПараметры должны начинаться с '/'. |
|
|
Дата: Авг 6, 2003 06:09:32 · Поправил: KiNDeR [Удалено за ненадобностью] |
|
|
Дата: Авг 6, 2003 06:15:43 · Поправил: Asterix Quantum правильно так и нужно, этот вариант у меня тоже был на примете, но только перед выходом на messagebox нужно было сделать inc eax, а то не красиво получается с /(палкой)... и в ExitProcess лучше загнать ecx наверно... p.s. но ты изменил своему алгоритму обработки строки с конца :-) |
|
|
Дата: Авг 6, 2003 06:37:53 Asterix нужно было сделать inc eax "inc eax" два раза, ведь курсор указывает на пробел перед палкой ;-) но ты изменил своему алгоритму обработки строки с конца :-) Я раньше использовал этот метод для нахождения последнего '\' в строке для отделения имени файла от остального пути (диск + каталог), но в данном случае лучше парсить строку один раз чем искать конец и возвращаться. ЗЫ: А раздел COMPO убрали зря :))) |
|
|
Дата: Авг 6, 2003 06:56:55 · Поправил: Asterix Два раза это правильно, а то я скомпилил и не пойму, потом дошло... в дебаггер лень было лезть: ----------------------------------------------------------- start: invoke GetCommandLine xor ecx,ecx parser: inc eax cmp WORD PTR [eax],2F20h ; " /" je found cmp BYTE PTR [eax],cl jne parser jmp noparam found: inc eax inc eax noparam: invoke MessageBox,ecx,eax,ecx,ecx invoke ExitProcess,ecx end start |
|
|
Дата: Авг 6, 2003 07:28:58 Итого 23 байта ??? А как ты их считаешь? У меня OllyDbg выдаёт 41. |
|
|
Дата: Авг 6, 2003 08:01:29 Или так: --------------------------------------------------------- start: invoke GetCommandLine xor ecx,ecx metka: cmp byte PTR [eax],cl jz noparam cmp word PTR [eax],2F20h ; " /" jz found inc eax jmp metka found: inc eax inc eax noparam: invoke MessageBox,ecx,eax,ecx,ecx invoke ExitProcess,ecx end start --------------------------------------------------------- Считаю так: 00401000 CALL DWORD PTR DS:[<&kernel32.GetCommand>; [GetCommandLineA 00401006 XOR ECX,ECX 00401008 CMP BYTE PTR DS:[EAX],CL 0040100A JE SHORT CMDLINE8.00401018 0040100C CMP WORD PTR DS:[EAX],2F20 00401011 JE SHORT CMDLINE8.00401016 00401013 INC EAX 00401014 JMP SHORT CMDLINE8.00401008 00401016 INC EAX 00401017 INC EAX 00401018 PUSH ECX ; /Style 00401019 PUSH ECX ; |Title 0040101A PUSH EAX ; |Text 0040101B PUSH ECX ; |hOwner 0040101C CALL DWORD PTR DS:[<&user32.MessageBoxA>>; \MessageBoxA 00401022 PUSH ECX ; /ExitCode 00401023 CALL DWORD PTR DS:[<&kernel32.ExitProces>; \ExitProcess 00401029 DB 00 0040102A DB 00 0040102B DB 00 0040102C DB 00 |
|
|
Дата: Авг 6, 2003 08:10:10 Так не 23, а 29 (до строчки 00401029 DB 00). 29h = 41d, т.е. 41 байт. |
|
|
Дата: Авг 6, 2003 08:25:38 Asterix 2) строка задаётся с:\Program Files\cmdline3 blabla ---------------------------------------------------------------------- работает даже если путь к файлу содержит пробелы, но только под w98, отгадайте почему не работает в XP :-) ---------------------------------------------------------------------- metka: invoke lstrlen,esi test eax,eax jz noparam .if byte ptr [esi]!='"' inc esi jmp metka .endif inc esi .if byte ptr [esi]!=' ' jmp metka .endif inc esi noparam: XP не заключает имя программы в кавычки, если в нем нет пробелов. |
|
|
Дата: Авг 6, 2003 08:43:30 · Поправил: Asterix Quantum Да, я не правильно считал... :( |
|
|
Дата: Авг 6, 2003 12:21:46 [ KiNDeR: Вообще-то в обработчиках строк ценится не размер кода, а скорость его выполнения. ] Командная строка парсится всего один раз за время жизни процесса! Так что забей на оптимизацию по скорости. |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.059 |