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

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

<< . 1 . 2 .

Посл.отвђт Сообщенiе


Дата: Авг 14, 2004 00:54:39 · Поправил: Black_mirror

Asterix
Посчитай сколько символов в моем коде и сколько в твоем. Мой код даже набрать быстрее 8)
А о том, сколько переходов будет сгенерировано, мне даже страшно подумать ...

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

В начале же извлекаеся имя сигнатуры, вот после того, как его извлекли можно и проверку такую сделать. Или в буфере должна последняя сигнатура остаться?


Дата: Авг 14, 2004 01:04:12

Black_mirror
И всё-таки мне кажется что раз прыжки парами в одно и то же место то в каждой паре по одному прыжку можно сократить, проверив условие как-нибудь по хитрому..


Дата: Авг 14, 2004 01:11:31

Asterix
Если хочешь один переход, то тебе сюда


Дата: Авг 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

<< . 1 . 2 .


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