Показать сообщение отдельно
  #15  
Старый 11.03.2013, 18:22
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Я бы делал как-то так:
Код:
   push esi
   mov  bx, CRC_st  //bX - Result
   mov  ecx, len
   mov  esi, buf
   cld
@loop1:
   lodsb
   xor  bl, al
   mov edx, 8 //цикл 8 раз
@loop2:
     shr bx, 1
     jc @m2
     xor bx, CRC_1
  @m2:
     dec edx
     jnz    @loop2
   dec ecx
   Jnz    @loop1 
   mov ax, bx
   pop esi
Насколько я знаю, lodsb нехило прокачан - всегда одни и те же регистры и не надо считать адрес. xor двух регистров опять же быстрее, чем xor с памятью. Так что вполне мб это скажется лучше.
Но в любом случае, inc и cmp надо было убирать любыми методами. Это самое медленное в коде.
А вариант с
Цитата:
mov al, byte ptr [buf+ESI-ECX] //на самом деле не mov a xor ну не важно, принцып
не прокатит, регистр нельзя вычитать в адресе.

Цитата:
Слушайте, зачем весь этот изврат с сокращением кода? Не так уж и критично если будет на паскале написана ф-я.
Вот если бы сравнивать студию и самопальный асм, то разницы не было бы вообще (0-2 команды). А вот делфа умеет компилить так, что разница по качеству в пользу самопала может быть в два-три раза. Если считать надо ну очень часто, это может сказаться на общей скорости процентов на 5. Когда я писал одну прогу, 5 процентов были двумя-тремя секундами.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием