
lect_13.ppt
- Количество слайдов: 12
ЛЕКЦИЯ № 12 СЛОЖНЫЕ СТРУКТУРЫ ДАННЫХ В АССЕМБЛЕРЕ К элементарным данным относятся: • непосредственные данные, представляющие собой числовые или символьные значения, являющиеся частью команды; • данные, описываемые с помощью директив резервирования и инициализации памяти. Сложные типы данных строятся на основе базовых типов. TASM поддерживает следующие сложные типы данных: • массивы; • структуры; • объединения; • записи.
МАССИВЫ В АССЕМБЛЕРЕ Массив – структурированный тип данных, состоящий из некоторого числа элементов одного типа. Описание и инициализация массива • перечислением элементов массива в поле операндов одной из директив описания данных mas dd 1, 2, 3, 4, 5 • используя оператор повторения dup mas dw 5 dup (0) • используя директивы label и rept … mas-b label mas-w label rept word 4 dw endm byte 0 f 1 fh
• используя цикл для инициализации значениями области памяти, которую можно будет впоследствии трактовать как массив Доступ к элементам массива В общем случае адрес элемента массива формируется по следующей схеме база + (индекс * размер элемента) Архитектура микропроцессора представляет достаточно удобные программно-аппаратные средства для работы с массивами. К ним относятся базовые и индексные регистры, которые позволяют реализовать несколько режимов адресации данных. Это позволяет организовать эффективную работу с массивами. • Если для описания адреса используется только один регистр, то речь идет о базовой адресации, и этот регистр рассматривается как базовый mov al, [ebx] • Если для задания адреса в команде используется прямая адресация (в виде идентификатора) в сочетании с одним регистром, то речь идет об индексной адресации. Регистр считается индексным и можно использовать масштабирование.
add eax, mas[ebx*4] • Если для описания адреса используются два регистра, то речь идет о базово-индексной адресации. Левый регистр рассматривается как базовый, а правый – как индексный sub ax, mas[bx][dx*2] Двумерные массивы Если последовательность однотипных данных в памяти трактуется как двумерный массив, расположенный по строкам, то адрес элемента (i, j) вычисляется по формуле: (база + количество_элементов_в_строке *размер_эл-та*i + j*размер эл-та) Здесь I=0…n-1 указывает номер строки, а j=0…m-1 указывает номер столбца. Для организации адресации двумерных массивов удобно использовать базово-индексную адресацию.
Пример: (Инициализация нескольких строк массива) masm model small. data mass dw 4 dup (3 dup(0)) ; инициализация массива (4 х 3) i db 0 j dw 0. stack 256. code start: mov ax, @data mov ds, ax xor ax, ax mov cx, 2 cycl 1: push cx
mov cx, 3 mov al, 6 mul i mov bx, ax mov j, 0 cycl 2: mov si, j shl si, 1 ; число столбцов ; смещение начала строки i ; номер столбца mov ; смещение столбца j отн. ; начала строки mass[bx][si], 1 ; занесение значения в inc loop pop inc loop j cycl 2 cx i cycl 1 память exit: end mov ax, 4 c 00 h int 21 h start
СТРУКТУРЫ Структура – это тип данных, состоящий из фиксированного числа элементов разного типа. Для использования структур необходимо: 1. задать шаблон структуры; 2. определить экземпляр структуры; 3. организовать обращение к элементам структуры. 4. Описание шаблона структуры 5. имя-структуры STRUC 6. <описание полей> 7. имя-структуры ENDS 8. <описание полей> - последовательность директив db, dw, dd, dq, dt. 9. Их операнды определяют размер полей и, при необходимости, начальные значения.
Пример: ( описание шаблона структуры) worker nam sex position age salary worker struc db db db ends 30 dup(“ “) ““ 30 dup(“ “) 2 dup(“ “) 4 dup(‘” “) ; информация о сотруднике ; Ф. И. О ; пол ; должность ; возраст ; оклад Определение экземпляра структуры [имя-переменной] имя-структуры , <список значений> Здесь: имя-переменной – идентификатор переменной данного типа; список значений – заключенный в угловые скобки список начальных значений элементов структуры, разделенных запятыми.
Пример: ( определение экземпляра структуры) data segment sotr 1 worker<“Иванов Сергей Петрович”, , ”художник”, ” 35”, ” 700”> sotr 2 worker<> data ends Доступ к полям структуры адресное-выражение. имя-поля-структуры Здесь: адресное-выражение – идентификатор переменной структурного типа или выражение в скобках, определяющее адрес начала области памяти, выделенной под соответствующую структуру. имя-поля-структуры – имя поля из шаблона структуры. Это на самом деле смещение относительно начала структуры. Таким образом, фактически вычисляется выражение (адресное-выражение)+(имя-поля-структуры)
Пример: (обращение к полю структуры) … mov xchg ax, word ptr sotr 1. age ah, al lea mov xchg bx, sotr 1 ax, word ptr [bx], age ah, al … Возможно определение массива структур. Для организации индексации такого массива можно определять размер элемента (фактически длину структуры) с помощью оператора type. Объединения имеют тот же синтаксис, что и структуры, однако их поля перекрываются в памяти.
ЗАПИСИ Описание записи имя-записи RECORD <описание элементов> представляет собой последовательность описаний отдельных элементов записи в соответствии с синтаксической диаграммой Имя записи RECORD Имя поля : Размер = Значение , Определение экземпляра записи Если необходимо при определении экземпляра обнулить все поля записи, то используется символ ? Если необходимо инициализировать некоторые поля, то используются угловые либо фигурные скобки.
Примеры: iotest … flag 1 flag 2 flag 3 record i 1: 1, i 2: 2=11, i 3: 1, i 4: 2=11, i 5: 2=00 iotest? ; все поля записи нулевые iotest<> ; значения полей принимаются из шаблона iotest<, 10, > ; переопределяется поле i 2 iotest{i 2=01} ; переопределяется поле i 2 Для работы с записями используются операторы: • width имя-элемента записи (имя-записи); • mask имя-элемента записи
lect_13.ppt