Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2 курс / Лекции / Лекция 22 - Сложные типы данных.ppt
Скачиваний:
40
Добавлен:
18.02.2023
Размер:
277.5 Кб
Скачать

Лекция 22

Сложные типы данных: массивы, структуры, объединения

Массивы

Специальных средств описания массивов в программах на языке Ассемблер нет. Описание массива на язык Ассемблер выглядит как обычное описание элемента данных с инициализацией несколькими значениями или с помощью оператора dup.

Вариант 1:

 

arr1

dw

1,2,3,4,5,6,7,8,9,0

Вариант 2

 

arr2

dw

10 dup(0)

arr3

dw

10 dup(?)

Массивы

Еще один способ описания массивов – это использование директив label и rept.

Директива label предназначена для описания меток определенного типа. Он не резервирует память под эти переменные.

Директива rept предназначена для повторения определенного количества строк программы, расположенных между этой директивой и директивой endm.

Пример описания массива с использованием директив label и rept:

arr_w

label

word

rept

5

 

endm

dw

4040h

 

 

 

 

 

 

Доступ к элементам массива

Для доступа к элементам одномерного массива удобно использовать индексную адресацию со смещением:

индекс * размер + смещение

В данном режиме смещение – это адрес начала массива, индекс – номер элемента, размер – размер одного элемента массива (может быть 1, 2, 4 или 8).

Пусть дан массив:

arr dw 1,2,3,4,5,6,7,8,9,0

Синтаксис обращения к 4-му элементу этого массива

mov

si, 4

mov

ax, arr[si*2]

 

 

Доступ к элементам массива

Рассмотренное ранее обращение к элементам массива возможно только если размер элементов массива составляет 1, 2, 4 или 8 байт.

В противном случае вычисления смещение элемента массива необходимо осуществлять перемножив размер элемента массива на его индекс. Обращение к элементу осуществляется следующим образом:

mov

ax, ind

mov

cx, size

mul

cx

mov

dx, mas[ax]

Доступ к элементам массива

Специальных средств для описания двумерных массивов в Ассемблере нет. Такие массивы представляются в виде одномерных массивов:

Двумерный

Одномерный

Массив

массив

1 2

[1 2] [3 4] [5 6]

3 4

 

5 6

 

Смещение элемента на позиции (i,j) в двумерном массиве вычисляется по формуле:

Смещение = база + количество_элементов_в_строке*размер_элемента*i + размер_элемента*j

Доступ к элементам массива

Доступ к элементам массива можно осуществить посредством базово-индексной адресации, в которой задействуется два регистра: базовый и индексный.

Пример для типа byte:

mov

eax, i

mov

ecx, n

mul

ecx

mov

esi, eax

mov

edi, j

mov

al, mas[esi][edi]

Пример для типа word:

mov

eax, i

mov

ecx, n

mul

ecx

shl

eax, 1

mov

esi, eax

mov

edi, j

mov

ax, mas[esi][edi*2]

Пример 1

Дан целочисленный массив (тип dword). Найти и вывести на экран максимальный элемент массива. Размер массива и его элементы вводятся пользователем. Максимальный размер массива – 100 элементов.

Программу реализовать в виде консольного приложения используя транслятор MASM32.

Пример 1

include \masm32\include\masm32rt.inc

.data

 

 

array

dd

100 dup(0)

num

dd 10

max

dd 0

buff

db

20 dup(0)

mess1

db

'Input number of elements: ',0

mess2

db

'Input elements:',0dh,0ah,0

mess3

db

'Max value: ', 0

mess4

db

'Incorrect number', 0dh, 0ah, 0

endl

db

0dh, 0ah, 0

 

 

 

Пример 1

.code

start:

call main

inkey

 

exit

 

main proc

 

cls

 

call

inputArray

or

eax, eax

jnz

next0

invoke StdOut, ADDR mess4

ret

 

next0:

 

call

findMaxArray

invoke dwtoa, eax, ADDR buff invoke StdOut, ADDR mess3 invoke StdOut, ADDR buff invoke StdOut, ADDR endl ret

main endp