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

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

4.4. IBM 370

Следующий пример на ассемблере для процессора IBM 370 суммирует по 4 байта одновременно. Для простоты опущен код дополнения, используемых для выравнивания данных по 4-байтовой границе и обращения порядка байтов, когда это требуется. Результат сохраняется в регистре RCARRY.

Этот код на процессоре IBM 3090 давал время расчета 27 мксек/кбайт при расчете контрольной суммы байтов, содержащих только единицы. Время расчета снижается до 24.3 мксек/кбайт, если применить средства выравнивания слов (специальная обработка в начале и в конце, а при необходимости замена местами байтов при расчете с нечетной позиции).

   *      Регистры RADDR и RCOUNT содержат адрес и размер суммируемого блока.
   *
   *      (RCARRY, RSUM) должны быть парой регистров (четный/нечетный).
   *      (RCOUNT, RMOD) должны быть парой регистров (четный/нечетный).
   *

   CHECKSUM  SR    RSUM,RSUM       Сброс рабочих регистров.
             SR    RCARRY,RCARRY
             LA    RONE,1          Установка значения 1.
   *
             SRDA  RCOUNT,6        Count/64 в RCOUNT.
             AR    RCOUNT,RONE       +1 = # число циклов.
             SRL   RMOD,26         Размер частичного блока в RMOD.
             AR    RADDR,R3        Выравнивание для компенсации перехода
             S     RADDR,=F(64)      в цикл.
             SRL   RMOD,1          (RMOD/4)*2 - индекс "полуслов".
             LH    RMOD,DOPEVEC9(RMOD) используется специальный вектор для
             B     LOOP(RMOD)          смещения и перехода в цикл...
   *
   *             Внутренний цикл:
   *
   LOOP      AL    RSUM,0(,RADDR)   Сложить логические слова
             BC    12,*+6             Переход, если нет переноса
             AR    RCARRY,RONE        Добавит ь 1 переноса
             AL    RSUM,4(,RADDR)   Сложить логические слова
             BC    12,*+6             Branch i f no carry
             AR    RCARRY,RONE        Добавить 1 переноса
   *
   *                    ... еще 14 повторов ...
   *
             A     RADDR,=F'64'    Увеличить адресный указатель
             BCT   RCOUNT,LOOP     Перейти к Count
    *
    *            Прибавить переносы к сумме и "затолкнуть" в 16 битов
    *
             ALR   RCARRY,RSUM      Сложить слова SUM и CARRY
             BC    12,*+6              и учесть возможный перенос
             AR    RCARRY,RONE
             SRDL  RCARRY,16        Поместить 32-битовую сумму
             SRL   RSUM,16            в 16 битов
             ALR   RCARRY,RSUM
             C     RCARRY,=X'0000FFFF' Прибавить оставшийся перенос
             BNH   DONE
             S     RCARRY,=X'0000FFFF'
   DONE      X     RCARRY,=X'0000FFFF' Дополнить до 1
2007 - 2018 © Русские переводы RFC, IETF, ISOC.