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

 WASM Phorum —› WASM.WIN32 —› Правильно писать CommandLine procedure...

<< . 1 . 2 . 3 . 4 . 5 . >>

Посл.отвђт Сообщен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 · Поправил: Quantum

start:
   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: Вообще-то в обработчиках строк ценится не размер кода, а скорость его выполнения. ]

Командная строка парсится всего один раз за время жизни процесса! Так что забей на оптимизацию по скорости.

<< . 1 . 2 . 3 . 4 . 5 . >>


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