Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовая работа тема Архиватор.doc
Скачиваний:
58
Добавлен:
01.04.2014
Размер:
476.67 Кб
Скачать

Приложение 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

}

}

35