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