CRC-32 purebasic

 Вчера был очередной забавный вечер. Для старого проекта мне понадобился подсчет CRC32, но для разных версий 5.30 и 5.72 есть некоторые изменения - разные функции с другими именами. Как тут быть - использовать проверку версии, или пойти другим путем?

Я решил пойти другим путем и написать другую реализацию подсчета контрольной суммы. Но вот незадача - подсчет неверен. Повтыкав на алгоритм и на набранный текст, я понял, в чем причина.

Причина в том, что используется знаковый 32-битный тип данных .l. Даже формирование таблицы делается неверно, не знаю, почему. Оставил задачу на утро, заодно хотел разобраться с ассемблером для этой среды.

С утра сел за ассемблер, и очередной облом - таблица считается неверно. Поступим старым индейским способом - транслируем сырок: 

"C:\Program Files\PureBasic\Compilers\pbcompiler.exe"/COMMENTED "d:\crc32\crc32.pb"

В исходнике видно, что описанный где-то там в интернетах способ обращения к переменным не прокатит, надо другое. Обращение к таблице тоже сделано иначе.

Короче, вот результат:

Global Dim t.l(255)
;calc
    For i = 0 To 255
      k.l = i
      For j = 0 To 7
        If (k & 1)
          ;k=k>>1
          ;k=k!$EDB88320
          !mov eax,dword [v_k]
          !shr eax,1
          !xor eax,0EDB88320h
          !mov dword[v_k],eax
        Else
          ;k=k>>1
          !mov eax,dword [v_k]
          !shr eax,1
          !mov dword[v_k],eax
        EndIf
      Next j
      t(i) = k
    Next i
    
    k=t(2)
    crc.l=-1
    s.s="The quick brown fox jumps over the lazy dog"
    For i=1 To Len(s)
      a.a=Asc(Mid(s,i,1))
      ;crc = (crc Shr 8) XOr table((crc And &hff) XOr buf[i])
      !mov eax,dword[v_crc]
      !mov ebx,eax
      !shr ebx,8
      !and eax,255
      !xor al,byte[v_a]
      !shl eax,2
      !MOV ebp,dword [a_t]
      !add ebp,eax
      !mov eax,dword [ebp]
      !xor ebx,eax
      !mov dword[v_crc],ebx
    Next i
    
    Debug Hex(~crc);414FA339


Комментарии