Страница 3 из 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. Но, тем не менее, эти примеры закончены и готовы к применению в реальных программах. |