1 / 31

Сложные структуры данных

Сложные структуры данных. Массивы. Строки переменной длины. Перечисления. Множества. Записи. Структуры. Объединения. Списки. Массивы. - упорядоченные множества элементов одного типа, занимающих непрерывное пространство в памяти машины.

tad
Download Presentation

Сложные структуры данных

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Сложные структуры данных Массивы. Строки переменной длины. Перечисления. Множества. Записи. Структуры. Объединения.Списки.

  2. Массивы - упорядоченные множества элементов одного типа, занимающих непрерывное пространство в памяти машины. Упорядоченность элементов массива определяет-ся набором целых чисел, называемых индекса-ми, которые связываются с каждым элементом массива и однозначно определяют его положе-ние среди остальных элементов этого массива.

  3. X = {xij: a≤i≤bиc≤j≤d} xa,cxa,c+1… xa,d-1xa,dxa+1,cxa+1,c+1 … xa+1,d-1xa+1,d… xij …xb-1,cxb-1,c+1 … xb-1,d-1 xb-1,dxb,cxb,c+1… xb,d-1xb,d

  4. Расположение в памяти Быстый последний индекс • По строкам: xa,c xa,c+1 … xa,d-1xa,d xa+1,c xa+1,c+1 … xa+1,d-1xa+1,d … xa+1,c xa+1,c+1 … xa+1,d-1xa+1,dxb,c xb,c+1 … xb,d-1xb,d • По столбцам: xa,c xa+1,c… xb-1,c xb,cxa,c+1xa+1,c+1 … xb-1,c+1xb,c+1 … xa,d-1xa+1,d-1 … xb-1,d-1xb,d-1xa,d xa+1,d… xb-1,d xb,d X+((i-a)*(d–c+1)+j-c)*Type X Быстрый первый индекс X+((j-c)*(b–a+1) + i-a)*Type X

  5. Строки переменной длины Произвольная длина Длину необходимо вычислять • Си String db ‘Это строка С’,0 • Паскаль String db Len-1,‘Строка Паскаля’Len = $ - String Длина не более 255 Длина всегда известна без вычислений

  6. Перечислимые типы данных Azb enum a,b,c,d,e,f,g,h,i,j,k,l,n,m,o,p,q,r,s,t,v,u,w,x,y,z ; a=0, b=1, … , z=25 Azb enum a=61h,b,c,… ; a=61h, b=62h, … mov al,azb ; al=31 Число бит, необходимых для представления множества, с перечисленным числом компонент

  7. Множество • совокупность элементов, обладающих общим для них характеристическим свойством. • конечная упорядоченная совокупность элементов, т.е. каждому элементу поставлено в соответствие натуральное число, являющееся номером элемента множества. Множество можно моделировать набором бит в количестве равном числу элементов множества, когда значение i-ого бита отвечает наличию или отсутствию i–ого элемента в множестве. Для множества мощностью n требуется n/8+1 байт

  8. Выделение места для размещения множества Setofmacro name,pw,xrr=pw/8if pw mod 8 ne 0rr=rr+1endifif rr eq 1 name label byteelseif rr eq 2 name label wordelseif rr le 4 name label dwordelseif rr le 8 name label qwordelse

  9. .err"Не могу создать множество такого размера“exitmendifkk=0while kk lt rrshablon=0irp i,<x>if i/8 eq kkshablon=shablon or (1 shl (i mod 8))endifendmdb shablonkk=kk+1endmendm

  10. Сегмент данных .data Alphabet enum A,B,C,D,E,F,G,H,I,J,K,L,N,M,O,P,Q,R,S,T,V,U,W,X,Y,Z SETOF VOWELS,Alphabet,<a,e,i,j,o,u> SETOF CONSONANTS,Alphabet,<b,c,d,f,g,h,k,l,m,n,p,q,r,s,t,v,w,x,y,z> Сегмент команд .code jnc short no main proc beepspkr mov ax,@data no: .exit 0 mov ds,ax main endp inmn VOWELS,B end main

  11. Inmn macro name,k;; Результат в fcifndef<name>.err ‘Имя &name не определено‘ exitmelseifndef <k>.err‘Имя &k не определено‘exitmendifif k gt (type name)*8 clcexitmendif pushaxpushbxmovax,kror ax,3shr ah,5 ;; ah=номербита, ;; al=номербайтаmov bl,alxor bh,bhmov bl,byte ptr name[bx]shr ax,8bts bx,axpop bxpop axendm Проверка присутствия элемента в множестве

  12. beepspkr macro times:=<1> pushax pushdx mov ah,2 mov dl,7 rept times int 21h endm pop dx pop ax endm Вспомогательный макрос

  13. Записи • наборы групп битовых полей внутри байта, слова или двойного слова. Формат описания шаблона:Имя_шаблонаRECORDайтем[,айтем…] Например: День Месяц Год Имя:длина[=значение по умолчанию] Константа равная сдвигу поля от правого края 15 14 13 12 11 11 10 9 8 7 7 6 5 4 3 2 1 0 0 Date_format record day:5=1,month:4=1,year:7=0

  14. mov ax,test_date and ax,mask month shr ax,month Описаниепеременных типа запись • Test_date Date_format <7,5,4> • Millennium Date_format <> • Yesterday Date_format {year =4,month=4} Операторы работы сзаписями • Maskимя_поляmov ax,mask year ; ax = 007fh • Widthимя_поляmov ax,width month ; ax = 4 • Getfildgetfild month bl,test_date • Setfild and test_date,not mask monthmov bx,6setfild month test_date,6 And test_date,not mask month Or test_date,6 shl month

  15. Структуры • совокупности переменных различного типа. Формат описания шаблона структуры:Имя_шаблонаstrucОписатель переменной[ …Описатель переменной]Имя_шаблонаends Например:Complex struc Re dd 0. Im dd 0.Complex ends Mov ax,type complex.re ; ax = 4Mov ax,type complex ; ax = 8 Имена переменных – константы, характеризующие расстояние поля от начала структуры в байтах

  16. Описание переменных формата структура • Cnul complex <> • Ced complex <1.,> • Ci complex {im=1.0} • Carray complex 10 dup <?,?> Доступ к полям структуры • Прямая адресацияMov eax,Cnul.Remov Cnul.Im,eax • Косвенная адресацияMov bx,offset CiMov eax,[bx].Im

  17. Объединения • наложение переменных различного типа. Формат описания шаблона объединения:Имя_шаблонаUnionописатель переменной[ …описатель переменной]Имя_шаблонаends • Правила работы те же, что и со структурами • Другой способ – использование директивыИмяLABELтип

  18. Списки • совокупность элементов типа структура, расположенных в произвольных местах памяти, связанных друг с другом через поля связи – переменные в которых хранятся ссылки (адреса) на следующий элемент. • Последний элемент списка (не связанный с другими) хранит в таком поле пустую ссылку, называемую nil. • Ссылка на первый элемент списка хранится в переменной, которую называют указателем на вершину списка.

  19. filds strucfild1 dw ? …filds ends Aitem struc list filds <> next dw ? Aitem ends Примерный формат элемента списка (aitem).

  20. Пример устройства «диспетчера» кучи .model small .386 nil = -1 Heap_size = 64*1024 filds struc fild1 db 8 dup(?) fild2 db ? filds ends aitem struc list filds <> next dw ? aitem ends

  21. Пример устройства «диспетчера» кучи .data Status db Heap_size/8 dup(0) top dw ? str1 db 'String 1' str2 db 'String 2' str3 db 'String 3' .stack 256 Heap segment para Htop db Heap_size dup(?) ; Куча Heap ends .code

  22. Создание нового элемента списка new macro size ifndef Heap .err exitm elseifndef Status .err exitm endif movax,size ; Размер искомого свободного участка callfind endm

  23. Удаление элемента списка Delite macro adr,sizemovbx,adr; Адрес освобождаемой памяти в bxmovcx,size; Размер освобождаемой областиcall clearendm Start macroassume es:Heapmov ax,@datamov ds,axmov ax,Heapmov es,axxor ax,axendm

  24. Сохранение и загрузка регистров SaveReg macro r1,r2,r3,r4,r5,r6,r7,r8,r9ifnb <r1> push r1 SaveReg r2,r3,r4,r5,r6,r7,r8,r9endifendm  LoadReg macro r1,r2,r3,r4,r5,r6,r7,r8,r9irp k,<r9,r8,r7,r6,r5,r4,r3,r2,r1>ifnb <k> pop kendifendmendm

  25. Основная программа main proc .Startnew %type aitem ; Найти подходящую область памяти для; размещения элемента спискаmovtop,ax; Указатель на вершину списка ; Первый элементmov bx,ax mov cx,8lea si,str1lea di,[bx].list.fild1repmovsb;заполнение поля fild1 первого элементаnew %type aitemmoves:[bx].next,ax ; адрес второго элементаmov es:[bx].list.fild2,'$'

  26. Создание 2 и 3 элементов mov bx,axmov cx,8lea si,str2lea di,[bx].list.fild1repmovsb ;заполнение поля fild1 второго элементаnew %type aitemmoves:[bx].next,ax; адрес третьего элементаmov es:[bx].list.fild2,'$' mov bx,axmov cx,8lea si,str3lea di,[bx].list.fild1repmovsb;заполнение поля fild1 третьего элемента moves:[bx].next,nil; конец спискаmov es:[bx].list.fild2,'$'

  27. Удаление элемента и печать списка mov bx,topdelitees:[bx].next,%type aitemmov bx,topmov di,es:[bx].nextmov ax,es:[di].nextmov es:[bx].next,ax mov bx,top ; Адрес текущего элемента спискаcont:cmp bx,niljzfin; достигнут конец спискаlea dx,[bx].list.fild1push dspush espop dsmov ah,09hint 21h;Печать тестового поля текущего элементаpop dsmov bx,es:[bx].nextjmp contfin: .exit 0main endp

  28. Процедура поиска места в куче find proc ; ax - размер требующейся памяти в байтахSaveRegbx,cx,dxmov cx,Heap_size/8 ; кол-во байт под статусmov bx,0push ax ; сохранить объем памяти в стеке m0: cmp status[bx],0ffh ; проверка на все единицыjz next1mov dl,1 ; 1 в левый бит m7: test status[bx],dl ; проверка битаjz m1pop ax ; текущий бит равен 1 - зановоpush axjmp short m2 m1: dec ax ; найден еще один нулевой бит jz yes ; найден нужный объем памяти m2: shl dl,1 ; маска для следующего битаjz m3 ; нужно перейти к новому байтуjmp m7

  29. Процедура поиска места в куче next1:pop ax ; восстановление размераpush ax m3: inc bx ; увеличение номера байтаloop m0 ; цикл по всем байтамjz no yes: shl bx,3 ; вычисление номера последнего битаpop cx ; считан размер m4: inc bx ; добавить сдвиг внутри байтаshr dl,1jnz m4sub bx,cx ; номер первого бита поляmov ax,bxpush ashr bx,3 ; номер байтand ax,07h; и еще сдвиг на несколько битmov ah,1push cxmov cl,alshl ah,cl; сдвиг маски в позицию первого бита

  30. Заполнение массива Status pop cx m6:or status[bx],ah ; заполнение 1 маски отводимого поляdec cxjz m5shl ah,1jnz m6inc bxmov ah,1jmp m6 no: mov ax,-1 m5: LoadReg bx,cx,dx,axret find endp

  31. Процедура освобождения памяти clear procSaveReg ax,dxmov ax,bxshr bx,3 ; номер байтаand ax,07h ; и еще сдвиг на несколько битmov ah,0fehpush cxmov cl,alrol ah,cl ; сдвиг маски в позицию первого битаpop cxm16:andstatus[bx],ah; заполнение 1 маски отводимого поляdec cxjz m15rol ah,1cmp ah,0fehjnz m16inc bxjmp m16m15: LoadReg ax,dxretclearendpend main Результат:

More Related