- •Лекция 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 (сравнение по убыванию ФИО)
- •Сравнение по полю «Курс»
- •Сравнение по полю «Успеваемость»
- •Процедура обмена
- •Процедура сортировки - продолжение
Структуры
Структура – это тип данных, состоящий из фиксированного числа элементов различных типов.
Для использования структур в программе необходимо выполнить три действия:
Задать шаблон структуры.
Определить экземпляр структуры.
Организовать обращение к элементам структуры.
Структуры
Описание шаблона структуры имеет вид: имя_структуры STRUC
<описание полей> имя_структуры ENDS
Здесь <описание полей> представляет собой последовательность описания данных db, dw, dd и т.д.
Пример описания структуры СТУДЕНТ student STRUC
fio |
db |
30 dup(“ “) |
year |
db |
0 |
rate |
db |
0 |
student ENDS
Структуры
Для описания переменных структурного типа на языке Ассемблер используется следующая синтаксическая конструкция:
[имя_переменной] имя_структуры <[список_значений]>
имя_переменной – идентификатор переменной данного структурного типа (если имя не указано, то просто будет выделен блок памяти для хранения значения).
список_значений – заключенный в угловые скобки список начальных значений элементов структуры, разделенных запятыми. Если список указан не полностью, то все поля структуры для данной переменной инициализируются значениями из шаблона.
Пример:
st1 |
student <‘Ivanov Ivan’, 1, 7> |
|
st2 |
student <‘Petrov Petr’, 2, 8> |
|
st3 |
student <> |
|
arr_st |
student 10 dup(<>) |
|
|
|
|
Структуры
Для доступа к отдельным элементам (полям) структуры в программе используется следующая синтаксическая конструкция:
адресное_выражение.имя_поля_структуры
Здесь:
адресное_выражение – идентификатор переменной некоторого структурного типа или выражение в скобках в соответствии с правилами:
[ |
Имя регистра |
+ |
] |
|
|
Константа |
|
|
|
- |
|
|
|
|
|
( |
Имя переменной |
+ |
) |
|
|
Константа |
|
|
|
- |
|
|
|
|
имя_поля_структуры – имя поля из шаблона структуры Таким образом оператор вычисляет выражение: (адресное_выражение)+(имя_поля_структуры)
Структуры
Пример обращения к полям структуры:
Первый способ:
mov al, byte ptr st1.year
Второй способ:
lea |
bx, st2 |
mov |
al, byte ptr [bx].year |
|
|
Структуры
Пример: вывести на экран список студентов средний балл которых больше или |
||
|
равен 6: |
|
student STRUC |
|
|
… |
|
|
student ENDS |
|
|
… |
|
|
st_list student |
10 dup(<>) |
|
… |
|
|
|
mov |
bx, 32 |
|
lea |
di, st_list |
|
mov |
cx, 10 |
cycl: |
|
|
|
mov |
al, byte ptr [di].rate |
|
cmp |
al, 6 |
|
jl |
next0 |
|
;вывод значения на экран |
|
next0: |
|
|
|
add |
di, 32 |
|
loop |
cycl |
|
|
|
Структуры
Копирование одной структуры в другую (целиком или только часть) осуществляется с помощью команд пересылки строк: movsb, movsw или movsd
Пример копирования структурной переменной st1 в структурную переменную st3:
mov |
si, offset st1 |
mov |
di, offset st2 |
mov |
cx, 32 |
rep movsb
Объединения
Объединение – тип данных, позволяющий трактовать одну и туже область памяти как имеющую разные типы и имена.
Описание объединения осуществляется практически также, как и описание структур:
имя_объединения UNION <описание полей> имя_объединения ENDS
Объединения
Пример:
mystruc STRUC pole1 dw 0 pole2 dw 0 mystruc ENDS
myunion UNION val1 dd 0 val2 mystruc<> myunion ENDS
Пример описания переменной:
un1 myunion <>
arr_un myunion 10 dup(<>)
Обращение к полям объединения осуществляется аналогично обращению к полям структуры:
mov |
eax, un1.val1 |
mov |
un1.val2.pole1, ax |
Пример
Пользователь с клавиатуры вводит список студентов. О каждом студенте вводится следующая информация: ФИО (строка 30 символов), курс и средний балл (целые числа размером 1 байт). Вывести на экран записи о студентах, средний балл которых не менее 6.
include \masm32\include\masm32rt.inc student STRUC
fio |
db |
30 dup(0) |
year |
db 0 |
|
rate |
db |
0 |
student ENDS