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

 WASM Phorum —› WASM.ASSEMBLER —› Есть такая задача по проверке байт строки..

. 1 . 2 . >>

Посл.отвђт Сообщен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
> А почему бы не сделать условием окончания цикла "прочитана пустая строка"?

Потому что я всё-равно должен отлавливать конец каждой подстроки и тут же нужно проверять а не конец ли это всей строки.

. 1 . 2 . >>


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