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


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

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



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

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

Листинг 6. Сортировка массива<1>;prg_12_5.asm<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;конец программы

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

Структуры,

Структуры

Рассмотренные нами выше массивы представляют собой совокупность однотипных элементов. Но часто в приложениях возникает необходимость рассматривать некоторую совокупность данных разного типа как некоторый единый тип.
Это очень актуально, например, для программ баз данных, где необходимо связывать совокупность данных разного типа с одним объектом.
К примеру, ранее мы рассмотрели листинг 4, в котором работа производилась с массивом трехбайтовых элементов. Каждый элемент, в свою очередь, представлял собой два элемента разных типов: однобайтовое поле счетчика и двухбайтовое поле, которое могло нести еще какую-то нужную для хранения и обработки информацию. Если читатель знаком с одним из языков высокого уровня, то он знает, что такой объект обычно описывается с помощью специального типа данных — структуры.
С целью повысить удобство использования языка ассемблера в него также был введен такой тип данных.

По определению структура — это тип данных, состоящий из фиксированного числа элементов разного типа.

Для использования структур в программе необходимо выполнить три действия:

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

Очень важно, чтобы вы с самого начала уяснили, в чем разница между описанием структуры в программе и ее определением.
Описать структуру в программе означает лишь указать ее схему или шаблон; память при этом не выделяется.
Этот шаблон можно рассматривать лишь как информацию для транслятора о расположении полей и их значении по умолчанию.
Определить структуру — значит, дать указание транслятору выделить память и присвоить этой области памяти символическое имя.

Описать структуру в программе можно только один раз, а определить — любое количество раз.

Описание шаблона структуры

Описание шаблона структуры имеет следующий синтаксис:

имя_структуры STRUC <описание полей>имя_структуры ENDS

Здесь <описание полей> представляет собой последовательность директив описания данных db, dw, dd, dq и dt.
Их операнды определяют размер полей и, при необходимости, начальные значения. Этими значениями будут, возможно, инициализироваться соответствующие поля при определении структуры.

Как мы уже отметили при описании шаблона, память не выделяется, так как это всего лишь информация для транслятора.

Местоположение шаблона в программе может быть поизвольным, но, следуя логике работы однопроходного транслятора, он должен быть расположен до того места, где определяется переменная с типом данной структуры. То есть при описании в сегменте данных переменной с типом некоторой структуры ее шаблон необходимо поместить в начале сегмента данных либо перед ним.

Рассмотрим работу со структурами на примере моделирования базы данных о сотрудниках некоторого отдела.
Для простоты, чтобы уйти от проблем преобразования информации при вводе, условимся, что все поля символьные.
Определим структуру записи этой базы данных следующим шаблоном:



Поделиться:


Последнее изменение этой страницы: 2017-02-05; просмотров: 398; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 54.224.70.148 (0.005 с.)