RFC: 1071
Оригинал: Computing the Internet Checksum
Категория: Не определено
Дата публикации:
Авторы: , ,
Перевод: Николай Малых

RFC 1071, Страница 6 из 9

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     pc@(2$-.-2:b,d2)  | Переход в цикл

1$:     | Начало внутреннего цикла...

    movl    a0@+,d2     |  Выборка 32-битового слова
    addxl   d2,d0       |    Сложение слова и предыдущего переноса
    movl    a0@+,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
2007 - 2017 © Русские переводы RFC, IETF, ISOC.