|
|
| Посл.отвђт | Сообщен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 |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.061 |