|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Авг 14, 2004 00:54:39 · Поправил: Black_mirror Asterix Посчитай сколько символов в моем коде и сколько в твоем. Мой код даже набрать быстрее 8) А о том, сколько переходов будет сгенерировано, мне даже страшно подумать ... Потому что я всё-равно должен отлавливать конец каждой подстроки и тут же нужно проверять а не конец ли это всей строки. В начале же извлекаеся имя сигнатуры, вот после того, как его извлекли можно и проверку такую сделать. Или в буфере должна последняя сигнатура остаться? |
|
|
Дата: Авг 14, 2004 01:04:12 Black_mirror И всё-таки мне кажется что раз прыжки парами в одно и то же место то в каждой паре по одному прыжку можно сократить, проверив условие как-нибудь по хитрому.. |
|
|
Дата: Авг 14, 2004 01:11:31 |
|
|
Дата: Авг 14, 2004 01:14:06 Black_mirror > В начале же извлекаеся имя сигнатуры, вот после того, как его извлекли можно и проверку такую сделать. Или в буфере должна последняя сигнатура остаться? После того как с сигнатурой поработает моя процедура сигнатура мне уже не нужна. Но из-за того что мы осуществляем набор 4-х байтов в eax для работы твоей hextonum, конец получается как бы плавающий, т.е. ноль может прийти в процессе набора байтов в eax или набор байтов окончится впритык к этому нулю, и поэтому всё-равно проверка сильно простой не получится, почему бы тогда уж и на конец строки(0,0) не проверить, сейчас код для набора байтов у меня такой: @loop3: xor edx,edx mov ecx,4 @@: shl eax, 8 test edx,edx jnz @done @skip: lodsb test al, al jnz @ok inc edx @ok: cmp al, 20h je @skip cmp al, 09h je @skip @done: loop @B call hextonum |
|
|
Дата: Авг 14, 2004 03:10:00 Я вобще планировал что будет jmp reg32, хотя про один регистр это я зря написал, вобщем нужен оптимальный по скорости вариант. ну так поточнее надо быть тогда, сколько тактов, etc. А то получается как в объявлении - "требуются маги и предсказатели. оплата высокая. куда и когда приходить - вы и сами знаете" :) А чем тебя тут скорость не нравится? |
|
|
Дата: Авг 14, 2004 04:01:53 masquer > А чем тебя тут скорость не нравится? Я ее не мерял, но мне казалось если операнд читается из памяти то это всегда медленнее, в данном случае адрес прыжка из таблицы. Всем спасибо за участие, вариантов у меня теперь достаточно, есть над чем подумать ;-) |
|
|
Дата: Авг 14, 2004 12:51:27 Asterix Да, я невнимательно прочитал условие. Сорри. :) |
|
|
Дата: Авг 14, 2004 15:41:10 · Поправил: S_T_A_S_ > если операнд читается из памяти то это всегда медленнее, в данном случае адрес прыжка из таблицы. Поскольку у тя тут цикл, то таблица после первого обращения к ней попадёт в кеш (если таблица большая как в моём примере, то для процев где строки кеша 16 байт, потребуется максимум 2 обращения), после этого работа с ней не будет медленнее, чем чтение [ESI] > Да ладно вам к моему HLL придираться то, вот вам чистый синтаксис masm'а.. Вот, кстати, как твой "чистый синтаксис" переварил MSVC: mov dl, BYTE PTR [ecx-1] test dl, dl mov al, BYTE PTR [ecx] jne $L543 test al, al je @exit $L541: test dl, dl je @1 test al, al jne @2 $L543: test al, al jne $L541 mov bl, BYTE PTR [ecx+1] test bl, bl jne $L541 |
|
|
Дата: Авг 14, 2004 17:08:27 · Поправил: Asterix S_T_A_S_ > Вот, кстати, как твой "чистый синтаксис" переварил MSVC Судя по всему не правильно, но это видимо ты не правильно ему указал ;-) Кстати вот так это сделал masm(вообще-то не лучшим образом, потому что напихал лишних переходов, которые вообще не используются :-): 00401000 > $ 807E FF 00 CMP BYTE PTR DS:[ESI-1],0 00401004 . 75 05 JNZ SHORT 0040100B 00401006 . 803E 00 CMP BYTE PTR DS:[ESI],0 00401009 . 74 0B JE SHORT 00401016 0040100B > 803E 00 CMP BYTE PTR DS:[ESI],0 0040100E . 75 0A JNZ SHORT 0040101A 00401010 . 807E 01 00 CMP BYTE PTR DS:[ESI+1],0 00401014 . 75 04 JNZ SHORT 0040101A 00401016 > EB 15 JMP SHORT @exit 00401018 . EB 11 JMP SHORT @1 0040101A > 807E FF 00 CMP BYTE PTR DS:[ESI-1],0 0040101E . 74 05 JE SHORT 00401025 00401020 . 803E 00 CMP BYTE PTR DS:[ESI],0 00401023 . 75 04 JNZ SHORT 00401029 00401025 > EB 04 JMP SHORT @1 00401027 . EB 02 JMP SHORT @1 00401029 >^EB D5 JMP SHORT @2 |
|
|
Дата: Авг 14, 2004 18:20:17 Где не правильно? я просто взял твой код и подправил. Другое дело, что от этих Jcc в глазах рябит :-) void main(){
char *esi;
if( (*(esi-1)==0 && *esi==0) || (*esi==0 && *(esi+1)==0) )
goto _exit;
else if ( *(esi-1)==0 || *esi==0 )
goto _1;
else
goto _2;
_exit: __asm int 3
_1: __asm int 3
_2: __asm int 3
} |
|
|
Дата: Авг 14, 2004 23:39:51 S_T_A_S_ У меня MSVC++6 генерит совсем другой код из твоего исходника, не очень оптимальный(хотя стоит ключ максимальной оптимизации), но более похожий на правильный. |
|
|
Дата: Авг 15, 2004 16:37:35 Asterix Это MSVC из toolkit2k3. Что-то я перемудрил, когда вырезал всякий дополнительный stuff, должно быть так: (положение метки @1 важно) jne @2 @1: ; или jmp @1 $L543: |
|
|
Дата: Авг 15, 2004 20:24:52 Black_mirror Вот избавился от одного jcc mov eax,[esi-1] test eax,0ffffh jz .exit test eax,0ffff00h jz .exit neg al sbb ecx,ecx test ah,cl jz .l1 .l2: |
|
|
Дата: Авг 16, 2004 12:06:25 Asterix Ты уверен, что корректно составил условие? Например, если выполняется условие - byte ptr [esi] == 0 && byte ptr [esi+1] == 0, то тебе не важно знать, что byte ptr [esi-1] не обязательно равняется нулю? |
|
|
Дата: Авг 16, 2004 12:54:22 q_q > то тебе не важно знать, что byte ptr [esi-1] не обязательно равняется нулю? Оно(byte ptr [esi-1]) тогда не может быть равно 0. Ты меня не путай, я и сам запутаюсь ;-) Короче я уже поменял логику определения конца строки, и двойной ноль буду искать в другом месте, а сам конец подстроки будет искать такой код: mov eax,[esi-1] neg al sbb ecx,ecx adc esi,-1 test ah,cl jz @label |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.124 |