- •Белорусский государственный университет информатики и радиоэлектронники
- •Курсовой проект
- •Содержание
- •Постановка задачи
- •Теоретические сведения
- •Идея арифметического кодирования.
- •Программа для арифметического кодирования.
- •Реализация модели.
- •Приращаемая передача и получение.
- •Отрицательное переполнение.
- •Переполнение
- •Ограниченность реализации
- •Завершение
- •Модели для арифметического кодирования
- •Фиксированные модели
- •Адаптивная модель
- •Описание функций
- •Руководство пользователя
- •Список литературы
- •Листинги программы
- •Приложение 1. Реализация процедурыencode_symbolна языке Ассемблер
Приложение 1. Реализация процедурыencode_symbolна языке Ассемблер
Для оптимизации программы, а именно, для увеличения ее быстродействия за счет уменьшения суммарного числа машинных команд программы, участки кода программы, отнимающие наибольшее количество машинного времени, следует переписать на языке Ассемблер. Из алгоритма программы видно, что на первом этапе оптимизации такими участками являются процедуры encode_symbol при кодировании, и decode_symbol при декодировании.
Процедура encode_symbol, сделанная в виде ассемблерной вставки в код, написанный на Си, приводится в листинге 3. К сожалению, компилятор Borland C++Builder 6, по невыясненным причинам, не смог скомпилировать эту процедуру правильно. А в консольной версии программы арифметического кодирования, реализованной в Borland C++ version 3.1, с такой вставкой кодирование файла осуществлялось примерно на 30% быстрее по сравнению с аналогичной программой, полностью написанной на Си.
Такое быстродействие достигается, главным образом, по двум причинам. Первая заключается в более рациональном вычислении значений выражений, в которых пересчитываются границы интервала low и high, по сравнению с действиями, которые производит участок кода, выполненный компилятором. Вторая – в том, что эти, наиболее часто используемые переменные low и high, почти постоянно располагаются в регистрах общего назначения. Поэтому действия, направленные на их сравнение и преобразование, выполняются гораздо быстрее.
Дальнейшими действиями по ускорению нашей программы, скорее всего, были бы те, которые исключили бы многократный вызов процедуры output_bit_plus_follow. Также переписать ее на ассемблере, и из самостоятельной процедуры сделать ее частью процедуры encode_symbol.
Листинг 3. Процедура encode_symbol, реализованная на Ассемблере
void encode_symbol (short int symbol )
{
long range=0;
asm{
mov ax,high //---------------находим range--------------
sub ax,low
mov word ptr range,ax //--------------------------------
mov bx,symbol //-----------находим high------------------
dec bx
shl bx,1
mul word ptr cum_freq[bx]
add ax,word ptr cum_freq[bx]
adc dx,0
sub ax,word ptr cum_freq[0]
sbb dx,0
div word ptr cum_freq[0]
add ax,low
mov high,ax //-------------------------------------------
add bx,2 //-----------------находим low------------------
mov ax,word ptr range
mul word ptr cum_freq[bx]
add ax,word ptr cum_freq[bx]
adc dx,0
div word ptr cum_freq[0]
add ax,low //--------------------------------------------
mov bx,high
}
l4: asm{
cmp ax, 0100000000000000b
jb l1
cmp bx,1100000000000000b
jnb l1
inc bits_to_follow
sub ax,0100000000000000b
sub bx,0100000000000000b
jmp l3;
}
l1: asm{
cmp bx,8000h
jnc l2
push ax
push bx}
output_bit_plus_follow(0);
asm{
pop bx
pop ax
jmp l3}
l2:
asm{
cmp ax,8000h
jb l5
push ax
push bx}
output_bit_plus_follow(1);
asm{
pop bx
pop ax}
/* Сдвиг влево с "втягиванием" очередного бита */
l3: asm{
shl ax,1
shl bx,1;
inc bx;
jmp l4;}
l5: asm{
mov low,ax
mov high,bx
}
}