Типовые операции с массивами

Для демонстрации основных приемов работы с массивами лучше всего подходят программы поиска или сортировки.

Рассмотрим одну такую программу, выполняющую сортировку массива по возрастанию.

Пример: Сортировка массива<2> MASM<3> MODEL small<4> STACK 256<5>.data<6> mes1 db 0ah,0dh,'Исходный массив — $',0ah,0dh<7>;некоторые сообщения<8> mes2 db 0ah,0dh,'Отсортированный массив — $',0ah,0dh<9> n equ 9;количество элементов в массиве, считая с 0<10> mas dw 2,7,4,0,1,9,3,6,5,8;исходный массив<11> tmp dw 0;переменные для работы с массивом<12> i dw 0<13> j dw 0<14>.code<15> main:<16> mov ax,@data<17> mov ds,ax<18> xor ax,ax<19>;вывод на экран исходного массива<20> mov ah,09h<21> lea dx,mes1<22> int 21h;вывод сообщения mes1<23> mov cx,10<24> mov si,0<25> show_primary:;вывод значения элементов<26>;исходного массива на экран<27> mov dx,mas[si]<28> add dl,30h<29> mov ah,02h<30> int 21h<31> add si,2<32> loop show_primary<33><34>;строки 40-85 программы эквивалентны следующему коду на языке С:<35>;for (i=0;i<9;i++)<36>; for (j=9;j>i;j--)<37>; if (mas[i]>mas[j])<38>; {tmp=mas[i];<39>; mas[i]=mas[j];<40>; mas[j]=tmp;}<41> mov i,0;инициализация i<42>;внутренний цикл по j<43> internal:<44> mov j,9;инициализация j<45> jmp cycl_j;переход на тело цикла<46> exchange:<47> mov bx,i;bx=i<48> shl bx,1<49> mov ax,mas[bx];ax=mas[i]<50> mov bx,j;bx=j<51> shl bx,1<52> cmp ax,mas[bx];mas[i]? mas[j] — сравнение элементов<53> jle lesser;если mas[i] меньше, то обмен не нужен и ;переход на продвижение далее по массиву<54>;иначе tmp=mas[i], mas[i]=mas[j], mas[j]=tmp:<55>;tmp=mas[i]<56> mov bx,i;bx=i<57> shl bx,1;умножаем на 2, так как элементы — слова<58> mov tmp,ax;tmp=mas[i]<59><60>;mas[i]=mas[j]<61> mov bx,j;bx=j<62> shl bx,1;умножаем на 2, так как элементы — слова<63> mov ax,mas[bx];ax=mas[j]<64> mov bx,i;bx=i<65> shl bx,1;умножаем на 2, так как элементы — слова<66> mov mas[bx],ax;mas[i]=mas[j]<67><68>;mas[j]=tmp<69> mov bx,j;bx=j<70> shl bx,1;умножаем на 2, так как элементы — слова<71> mov ax,tmp;ax=tmp<72> mov mas[bx],ax;mas[j]=tmp<73> lesser:;продвижение далее по массиву во внутреннем цикле<74> dec j;j--<75>;тело цикла по j<76> cycl_j:<77> mov ax,j;ax=j<78> cmp ax,i;сравнить j? i<79> jg exchange;если j>i, то переход на обмен<80>;иначе на внешний цикл по i<81> inc i;i++<82> cmp i,n;сравнить i? n — прошли до конца массива<83> jl internal;если i<84><85>;вывод отсортированного массива<86> mov ah,09h<87> lea dx,mes2<88> int 21h<89> prepare:<90> mov cx,10<91> mov si,0<92> show:;вывод значения элемента на экран<93> mov dx,mas[si]<94> add dl,30h<95> mov ah,02h<96> int 21h<97> add si,2<98> loop show<99> exit:<100> mov ax,4c00h;стандартный выход<101> int 21h<102> end main;конец программы

В основе программы лежит алгоритм, похожий на метод пузырьковой сортировки. Эта программа не претендует на безусловную оптимальность, так как существует целая теория, касающаяся подобного типа сортировок. Перед нами стоит другая цель — показать использование средств ассемблера для решения подобного рода задач. В программе два цикла. Внешний цикл определяет позицию в массиве очередного элемента, с которым производится попарное сравнение элементов правой части массива (относительно этого элемента). За каждую итерацию внешнего цикла на месте этого очередного элемента оказывается меньший элемент из правой части массива (если он есть).

В остальном программа достаточно проста и на языке высокого уровня заняла бы около десятка строк.

Cтек


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: