|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Авг 12, 2004 01:25:33 Моя функция ничего никуда не приписывает, она получает четыре символа в регистре eax и выдает два байта в регистре ax. |
|
|
Дата: Авг 12, 2004 02:00:50 · Поправил: Asterix Black_mirror Попытался собрать всё в кучу, ошибки конечно же присутствуют, но самое главное что после работы твоей процедуры я не могу байты привести в правильный вид xchg al,ah в конце явно недостаточно.
include '%fasminc%/win32axp.inc'
.data
src db 'sign1 = 9A FF FF 00 00 9A FFFF 0000 5589 E531 ::::FF0000',0
db 'sign 2=A1::::::::C1::::A3::::::::83::::::::75::575133C0BF',0
db 'sign3 =A1::::::::C1::::A3::::::::575133C0BF::::::::B9::::::::3BCF76',0,0
buff rb 1000h
flag dd 0
.code
align 4
start:
mov esi,src
@loop:
mov edi,buff
@find_first_byte_sign_name:
lodsb
cmp al,20h ; если пробел, то проверять следующий символ
je @find_first_byte_sign_name
cmp al,09h ; если табуляция, то проверять следующий символ
je @find_first_byte_sign_name
@find_signature_start:
test al,al
jz @test ; если 0, то проверить следующий символ на равенство 0
cmp al,'='
je @found
stosb
lodsb
jmp @find_signature_start
@found:
xor eax,eax
stosb
;---------------------------
@loop3:
xor eax, eax
mov ecx, 4
and [flag],eax
@@:
shl eax, 8
@skip:
lodsb
test al, al
jnz @ok
mov ecx,1
mov [flag],1
jmp @done
@ok:
cmp al, 20h
je @skip
cmp al, 09h
je @skip
@done:
loop @B
; -----------------------------------
;hextonum:;(eax - four char):ax - num
;A..F -> a..f
mov ecx,40404040h ;перевод букв в верхний регист
and ecx,eax ;также могут буть заменены и некоторые другие символы
shr ecx,1 ;но на правильность работы функции это никак не влияет
not ecx
and eax,ecx
;char -> BCD
lea edx,[eax-'0000']
or edx,80808080h ;для избежания распространения переноса в соседние байты
lea ebx,[edx-'AAAA'+'0000'] ;принадлежит ли байт диапазону A..F
lea ecx,[edx-'GGGG'+'0000']
xor ebx,ecx ;bit7=1 if A..F
lea ecx,[edx-0A0A0A0Ah] ;принадлежит ли байт диапазону 0..9
xor ecx,edx ;bit7=1 if 0..9
not eax ;bit7=1 if not digit
xor ecx,ebx ;буква или цифра
and eax,ecx ;bit7=1 if digit
;if A..F then sub 7
and ebx,80808080h ; сдвигаем интервал A..F к интервалу 0..9
shr ebx,4
sub edx,ebx
shr ebx,3
add edx,ebx
;create mask
and eax,80808080h ;обнуляем все символы не цифры
mov ecx,eax
shr ecx,7
sub eax,ecx
and eax,edx ;not digit -> 0
;BCD -> num
mov edx,eax ;в каждом байте теперь по одной 16-ричной цифре
shl edx,12
add eax,edx
mov al,ah
rol eax,8
;xchg al,ah
;ret
; -----------------------------------
mov WORD [edi], ax
cmp [flag],1
je @loop
inc edi
inc edi
jmp @loop3
;--------------------------------------------------------------------- -----------------
@test:
mov al, BYTE [esi+1]
;@test2:
test al, al
jnz @loop
@exit:
invoke ExitProcess, 0
.end start |
|
|
Дата: Авг 12, 2004 02:06:57 Black_mirror > Моя функция ничего никуда не приписывает, она получает четыре символа в регистре eax и выдает два байта в регистре ax. Я имел ввиду если в конце сигнатуры я не доберу байты до четырёх, то в eax у меня вместо них окажутся нули и соответственно твоя процедура после преобразования тоже должна приписать нули в конце сигнатуры и они как бы лишние, но это не страшно. |
|
|
Дата: Авг 12, 2004 09:00:11 · Поправил: Black_mirror Asterix после работы твоей процедуры я не могу байты привести в правильный вид Нужно либо заменить код накапливающий символы: xor eax,eax mov ecx,4 .l0: lodsb cmp al,20h jz .l0 cmp al,9 jz .l0 test al,al jz .l1 ror eax,8 loop .l0 .l1: shl ecx,3 ror eax,cl Либо код в конце моей процедуры: mov edx,eax shr edx,4 add eax,edx mov ah,al shr eax,8 xchg al,ah |
|
|
Дата: Авг 12, 2004 16:27:28 Black_mirror > Либо код в конце моей процедуры Спасибо, сделал именно так. Но чтобы отлавливать конец подстроки я такого нагородил, что теперь не радостно мне.. |
|
|
Дата: Авг 16, 2004 00:23:21 Black_mirror Неожиданно обнаружился косяк, твоя процедура подстроку db 'sign 2=A1::::::::C1::::A3::::::::83::::::::75::575133C0BF',0 почему-то переводит в A100000000C10000A30000000083000000007500575133C0BE т.е. когда eax=42460000h вместо BF00 получаем BE00 |
|
|
Дата: Авг 16, 2004 05:28:37 · Поправил: q_q Asterix Еще поясни по условию задачи. Двоеточия всегда идут парами? |
|
|
Дата: Авг 16, 2004 11:35:02 q_q Да. |
|
|
Дата: Авг 16, 2004 12:09:03 Asterix А значимых байтов между знаком равно и нуль-символом в конце сигнатуры четное число? |
|
|
Дата: Авг 16, 2004 12:42:32 q_q > А значимых байтов между знаком равно и нуль-символом в конце сигнатуры четное число? Естественно в ASCII строке должно быть четное число символов между '=' и завершающим символом 0(не считая пробелов и табуляции), по условию. Но кажется я об этом уже писал ранее ;-) |
|
|
Дата: Авг 20, 2004 03:50:22 Asterix т.е. когда eax=42460000h вместо BF00 получаем BE00 Здесь есть глюк: ; lea edx,[eax-'0000'] ; or edx,80808080h А здесь его уже нет: mov edx,eax or edx,80808080h sub edx,'0000' |
|
|
Дата: Авг 20, 2004 11:09:20 Black_mirror Надеюсь теперь всё будет работать и непредвиденных глюков не возникнет, потому что я пока не в состоянии разобраться как работает твоя процедура, т.е. проследить за каждым битом, хотя конечно некоторые моменты и понятны ;-) Кстати нашёл ещё одну реализацию перевода на MMX by Степан/The Svin , но там нужно чтобы входящие байты были исключительно ASCII символы, хотя процедура ооочень компактная. |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.077 |