- •Лекция 22
- •Массивы
- •Массивы
- •Доступ к элементам массива
- •Доступ к элементам массива
- •Доступ к элементам массива
- •Доступ к элементам массива
- •Пример 1
- •Пример 1
- •Пример 1
- •Пример 1
- •Пример 2
- •Пример 2
- •Пример 2 (процедура main)
- •Пример 2 (процедура main)
- •Пример 2 (создание массива)
- •Пример 2 (ввод элементов массива)
- •Пример 2 (поиск значения)
- •Пример 2 (вычисление
- •Пример 2 (уничтожение массива)
- •Структуры
- •Структуры
- •Структуры
- •Структуры
- •Структуры
- •Структуры
- •Структуры
- •Объединения
- •Объединения
- •Пример
- •Пример
- •Пример
- •Пример
- •Пример
- •Пример
- •Пример 2
- •Пример 2 (описание структуры)
- •Пример 2 (сегмент данных)
- •Пример 2 (программа – начало)
- •Пример 2 (Процедура main – ввод имени файла и его проверка)
- •Пример 2 (процедура main – загрузка списка и вывод на экран)
- •Пример 2 (процедура main – ввод параметров сортировки)
- •Пример 2 (процедура main – передача процедуры сравнения при
- •Пример 2 (процедура main – вызов сортировки и вывода
- •Пример 2 (сравнение по возрастанию ФИО)
- •Пример 2 (сравнение по убыванию ФИО)
- •Сравнение по полю «Курс»
- •Сравнение по полю «Успеваемость»
- •Процедура обмена
- •Процедура сортировки - продолжение
Лекция 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