Вчера был очередной забавный вечер. Для старого проекта мне понадобился подсчет CRC32, но для разных версий 5.30 и 5.72 есть некоторые изменения - разные функции с другими именами. Как тут быть - использовать проверку версии, или пойти другим путем?
Я решил пойти другим путем и написать другую реализацию подсчета контрольной суммы. Но вот незадача - подсчет неверен. Повтыкав на алгоритм и на набранный текст, я понял, в чем причина.
Причина в том, что используется знаковый 32-битный тип данных .l. Даже формирование таблицы делается неверно, не знаю, почему. Оставил задачу на утро, заодно хотел разобраться с ассемблером для этой среды.
С утра сел за ассемблер, и очередной облом - таблица считается неверно. Поступим старым индейским способом - транслируем сырок:
"C:\Program Files\PureBasic\Compilers\pbcompiler.exe"/COMMENTED "d:\crc32\crc32.pb"
В исходнике видно, что описанный где-то там в интернетах способ обращения к переменным не прокатит, надо другое. Обращение к таблице тоже сделано иначе.
Короче, вот результат:
;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
Комментарии
Отправить комментарий