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

 WASM Phorum —› WASM.ASSEMBLER —› Требуется оптимизировать по скорости.

<< . 1 . 2 .

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

<< . 1 . 2 .


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