Контрольные суммы: сумма Флетчера
Страница 3. Реализация суммы Флетчера


 

Реализация

Ниже даны функции вычисления суммы Флетчера на языке C и на ассемблере для процессоров Intel x86. Функция на C вычисляет сумму побайтно, функция на ассемблере вычисляет сумму блоками по два байта. Момент переполнения определяется по третьему и четвёртому способам соответственно.

typedef unsigned char byte;
byte FletchSum(byte *buf, size_t len){
byte S = 0;
for(; len > 0; len--){
byte R = *buf++;
S += R; if(S < R) S++;
}
/*if(S = 255) S = 0;*/
return S;
}

Функция на ассемблере работает только с буферами, длина которых не нулевая и кратна 2. На входе адрес буфера в DS:SI, длина буфера в CX. На выходе значение суммы в DL.

shr cx,1 ; CX=CX/2 - преобразовать к счётчику слов
xor dx,dx ; DX=0, также сбросить флаг переноса
do: lodsw ; AX=[DS:SI], SI+=2
adc dx,ax ; добавить с учётом предыдущего переноса
loop do ; CX--; jnz do
adc dl,dh ; сократить сумму: от модуля 0FFFFh...
; ...перейти к модулю 0FFh
;adc dl,1 ; если сумма==255 то сумма=0
adc dl,0
;dec dl

Пример реализации суммирования на C не оптимизирован для сложения блоками более чем байты, а пример на ассемблере не отрабатывает буфера с нулевой длиной или длиной, не кратной 2. Но, тем не менее, эти примеры закончены и готовы к применению в реальных программах.

 
« Предыдущая статья   Следующая статья »