4.2. Motorola 68020
Ниже приведен пример ассемблерной реализации алгоритма для процессора Motorola 68020. Этот вариант использует суммирование 32-битовых значений в один прием и использует внутренний цикл сложения с 16 операциями. Для простоты была опущена логика дополнения последнего слова для случаев, когда число суммируемых байтов не кратно 4. Результат сохраняется в регистре d0.
При тактовой частоте процессора 20 МГц время расчета контрольной суммы составляет 134 мксек/кбайт. Разработал этот алгоритм Van Jacobson.
movl d1,d2
lsrl #6,d1 | count/64 = # число проходов цикла
andl #0x3c,d2 | Нахождение частей блока
negl d2
andb #0xf,cc | Сброс X (расширенный флаг переноса)
jmp [email protected]
(2$-.-2:b,d2) | Переход в цикл
1$: | Начало внутреннего цикла...
movl [email protected]
+,d2 | Выборка 32-битового слова
addxl d2,d0 | Сложение слова и предыдущего переноса
movl [email protected]
+,d2 | Выборка 32-битового слова
addxl d2,d0 | Сложение слова и предыдущего переноса
| ... еще 14 повторов
2$:
dbra d1,1$ | (Отметим, что dbra не воздействует на X)
movl d0,d1 | Вталкивание 32 битов суммы в 16 битов
swap d1 | (Отметим, что swap не воздействует на X)
addxw d1,d0
jcc 3$
addw #1,d0
3$:
andl #0xffff,d0