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

 WASM Phorum —› WASM.A&O —› Str_to_Int

<< . 1 . 2 . 3 . 4 .

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


Дата: Май 7, 2004 12:29:28

Quantum
агу...

З.Ы. чего-то форум править не дает


Дата: Май 7, 2004 12:45:00

раз уж тема всплыла...
		xor edx,edx
		xor ecx,ecx
@@:
		mov eax,-30303030h
		add eax,[esi]
		add esi,4
		cmp al,9
		...

может такое начало будет быстрее?


Дата: Май 7, 2004 18:47:43

Преобразование 4хсимвольной 16ричной ASCII-строки (в верхнем регистре) в 16битный двоичный формат:
    mov eax,[esi]
    mov edx,30303030h
    sub eax,edx
    and edx,eax
    shr edx,4
    add eax,edx
    shl edx,3
    lea edx,[edx + edx * 2]
    xor eax,edx
    xchg ah,al
    db 0D5h,010h ; aad 16
    ror eax,16
    xchg ah,al
    db 0D5h,010h ; aad 16
    xchg ah,al
    shr eax,8 ; результат в AX


Дата: Май 7, 2004 23:16:08 · Поправил: Black_mirror

Quantum
Небольшая оптимизация:
  mov eax,[esi]
  mov edx,30303030h
  sub eax,edx
  and edx,eax
  shr edx,1
  sub eax,edx
  shr edx,3
  add eax,edx
  mov edx,eax
  shl edx,12
  add eax,edx
  mov al,ah
  rol eax,8


Дата: Май 8, 2004 00:32:48

Black_mirror
Супер!!!


Дата: Июн 7, 2004 14:13:36 · Поправил: Black_mirror

Для учета того, что строка может быть в верхнем регистре, можно добавить такой код(после mov eax,[esi]):
  mov edx,40404040h
  and edx,eax
  shr edx,1
  xor eax,edx


А вот еще полезная функция:
;функция вычисляет длину шестнадцатиричного числа
;вход:
;esi - указатель на строку
;выход:
;eax - длина числа в байтах
;esi - указатель на последнее двойное слово, содержащее 0,1,2,3 символов числа
;ecx - количество бит относяцихся к числу, в последнем двойном слове
hex_len:;(esi - string)
	xor ebx,ebx
	sub esi,4
    .l0:
	add esi,4
	mov eax,[esi]		;чтение четырех символов
	or eax,80808080h	;чтобы перенос не испортил следующий байт

	lea edx,[eax-'0000']	;здесь производятся сравнения каждого байта
	lea ecx,[eax-3A3A3A3Ah] ;c границами интервалов, результаты xor'ятся
	xor edx,ecx		;бит 7=0 если байт меньше границы
        lea ecx,[eax-'AAAA']	;бит 7=1 если байт больше границы
	xor edx,ecx		
        lea ecx,[eax-'GGGG']
	xor edx,ecx
	lea ecx,[eax-'aaaa']
	xor edx,ecx
	lea ecx,[eax-'gggg']    ;в результате
	xor edx,ecx		;бит 7=1 если символ это шестнадцатиричная цифра

	not edx			;теперь бит 7=1 если это не цифра
	or edx,[esi]	;старшие биты символов не учавствовали в сравнении
				;поэтому учтем их тоже
	and edx,80808080h	;оставим только интересующие нас биты
	shr edx,7		
	mov ecx,32              ;на случай неудачного поиска
	bsf ecx,edx             ;ищем бит, который уже не относится к числу
	lea ebx,[ebx+ecx]	;длина числа в битах
	jz .l0
	mov eax,ebx
	shr eax,3		;длина числа в байтах
	ret

<< . 1 . 2 . 3 . 4 .


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