|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Авг 13, 2004 19:40:14 · Поправил: Asterix В текущем месте строки, указатель на которую находится в esi нужно проверить байты по адресу [esi-1] , [esi] и [esi+1] на равенство их нулю и выполнить переход по условию if BYTE [esi-1]==0 && BYTE [esi]==0 || BYTE [esi]==0 && BYTE [esi+1]==0 то делать jmp @exit elseif BYTE [esi-1]==0 || BYTE [esi]==0 то делать jmp @1 else делать jmp @2 желательно ограничиться одним прыжком, регистры можно использовать любые кроме esi,edi,ebp и esp конечно. |
|
|
Дата: Авг 13, 2004 20:02:16 типа того, если я правильно условие понял :) но код не проверял. mov eax, [esi-1] mov edx, eax and edx, 0ffffh shr eax, 8 and eax, 0ffffh sub edx, 1 sbb edx, edx sub eax, 1 sbb eax, eax not edx not eax add eax, edx not eax lea edx, @@lookup_table jmp dword ptr [edx+eax*4] ... @@lookup_table: dd offset @@exit dd offset @1 dd offset @2 |
|
|
Дата: Авг 13, 2004 20:42:53 masquer Я вобще планировал что будет jmp reg32, хотя про один регистр это я зря написал, вобщем нужен оптимальный по скорости вариант. |
|
|
Дата: Авг 13, 2004 21:00:01 imho, можно ещё так: mov eax, [esi-1] xor edx, edx neg al adc dl, dh neg ah adc dl, dh jmp dword ptr @@lookup_table[edx * 4] @@lookup_table: dd offset @@exit dd offset @1 dd offset @2 |
|
|
Дата: Авг 13, 2004 21:46:13 Код не проверял, т.к. не уверен, что условие правильно понял.. xor ebx,ebx xor eax,eax cmp bl,[esi-1] rcl eax,1 cmp bl,[esi] rcl eax,1 cmp bl,[esi+1] rcl eax,1 jmp [jt+eax*4] align 16 jt: ; esi -1 0 +1 dd @exit 0 0 0 dd @exit 0 0 1 dd @1 0 1 0 dd @1 0 1 1 dd @exit 1 0 0 dd @1 1 0 1 dd @2 1 1 0 dd @2 1 1 1 |
|
|
Дата: Авг 13, 2004 23:20:45 Asterix Это ты таким методом двойной ноль ищешь? - Забудь про ЯВУ! Самый простой вариант(возможно и самый быстрый): mov eax,[esi-1] test eax,0ffffh jz .exit cmp al,0 jz .l1 test eax,0ffff00h jz .exit cmp ah,0 jz .l1 .l2: |
|
|
Дата: Авг 13, 2004 23:43:13 green А где проверка третьего байта строки? S_T_A_S_ > т.к. не уверен, что условие правильно понял.. Неужели я невнятно объяснил условие? ;-) Но в твоём коде мы три раза читаем байты в памяти, мне кажется это будет медленнее чем прочитать один раз одним DWORD'ом. |
|
|
Дата: Авг 14, 2004 00:14:26 Black_mirror > Забудь про ЯВУ! Это я лишь для условия написал :-) > Это ты таким методом двойной ноль ищешь? Да, это продолжение той задачи ;-) > cmp al,0 А почему не test al,al нельзя что-ли? |
|
|
Дата: Авг 14, 2004 00:24:00 Как сказать.. Проц всё равно будет по 16/32 байта читать, а дальше данные будут из кеша браться. Байты можно смело читать с любого адреса, а DWORD'ы рекомендуется только с кратных 4. Тем более если ещё и партиальные регистры (ah) задействуются.. Переделать читая DWORD'ы проблем нет. Я в таком виде написАл, что бы понятней было как работает. Но пока так и не уверн, подходит ли это под твою кучу IF/ELSE, т.к. я в них запутался %) PS: align лучше 32 делать. |
|
|
Дата: Авг 14, 2004 00:25:39 · Поправил: Black_mirror Asterix cmp al,0 можно и так оставить, а вот cmp ah,0 точно на test нужно заменить. А почему бы не сделать условием окончания цикла "прочитана пустая строка"? PS: Твой "HLL" никому не понятен 8))) PPS: Исправлено в связи с протестом Володи. |
|
|
Дата: Авг 14, 2004 00:29:01 Твой HLL никому не понятен Я протестую. Это не HLL. Эта фигня недостойна звания HLL! :) |
|
|
Дата: Авг 14, 2004 00:38:07 Black_mirror Твой код неправильный, есть возможность попасть на .l1 раньше чем на .exit |
|
|
Дата: Авг 14, 2004 00:41:47 Asterix Ну тогда так: mov eax,[esi-1] test eax,0ffffh jz .exit test eax,0ffff00h jz .exit test al,al jz .l1 test ah,ah jz .l1 .l2: |
|
|
Дата: Авг 14, 2004 00:46:46 Да ладно вам к моему HLL придираться то, вот вам чистый синтаксис masm'а: .IF (BYTE PTR [esi-1]==0 && BYTE PTR [esi]==0) || (BYTE PTR [esi]==0 && BYTE PTR [esi+1]==0) jmp @exit .ELSEIF BYTE PTR [esi-1]==0 || BYTE PTR [esi]==0 jmp @1 .ELSE jmp @2 .ENDIF |
|
|
Дата: Авг 14, 2004 00:51:48 Black_mirror > А почему бы не сделать условием окончания цикла "прочитана пустая строка"? Потому что я всё-равно должен отлавливать конец каждой подстроки и тут же нужно проверять а не конец ли это всей строки. |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.065 |