- •Лекция 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 (сравнение по убыванию ФИО)
- •Сравнение по полю «Курс»
- •Сравнение по полю «Успеваемость»
- •Процедура обмена
- •Процедура сортировки - продолжение
Пример
.data |
|
|
|
list |
student |
20 dup(<>) |
|
num |
dd |
0 |
|
mess0 |
db |
'Input number of students: ',0 |
|
mess1 |
db |
'FIO: ', 0 |
|
mess2 |
db |
'YEAR: ', 0 |
|
mess3 |
db |
'RATE: ', 0 |
|
endl |
db |
0dh, 0ah, 0 |
|
spac |
db |
' ', 0 |
|
buff |
db |
31 dup(0) |
|
|
|
|
|
Пример
.code |
|
|
start: |
|
|
call |
main |
|
inkey |
|
|
exit |
|
|
main |
proc |
|
cls |
|
|
call |
InputList |
;Вызов процедуры ввода списка |
or |
eax, eax |
;Проверка корректности ввода |
jnz |
next0 |
;Если ввод корректен, то переход |
ret |
|
;Выход, если ввод не корректен |
next0: |
|
|
lea |
esi, list |
;Установка ESI на начало списка |
mov |
ecx, num |
;Запись в ECX количества элементов |
loop0: |
|
|
push |
ecx |
;Сохранение ECX в стеке |
mov |
al, BYTE PTR [esi+31] |
;Заносим в AL средний балл текущего студента |
cmp |
al, 6 |
;Сравниваем с 6 |
jl |
next1 |
;Если меньше, то переход |
call |
OutputStudent |
;Вызов процедуры вывода информации о студенте |
next1: |
|
|
add |
esi, 32 |
;Переход к следующей записи |
pop |
ecx |
;Восстановление ECX |
loop |
loop0 |
;Переход на следующую итерацию цикла |
ret |
|
;Выход |
main endp |
|
|
|
|
|
Пример
InputList proc |
;Процедура ввода списка |
|
invokeStdOut, ADDR mess0 |
;Вывод приглашения к вводу размера |
|
invokeStdIn, ADDR buff, 30 |
;Ввод размера списка |
|
invokeatol, ADDR buff |
;Преобразование в число |
|
cmp |
eax, 20 |
;Сравнение с 20 |
jle |
next0 |
;Если меньше или равно, то переход |
xor |
eax, eax |
;Установка кода ошибки |
ret |
|
;Выход |
next0: |
|
|
mov |
num, eax |
;Запись в ячейку num размера списка |
lea |
edi, list |
;Установка EDI на список |
mov |
ecx, eax |
;Запись в ECX количества элементов |
loop0: |
|
|
push |
ecx |
;Сохранение ECX в стеке |
call |
InputStudent |
;Вызов процедуры ввода записи о студенте |
add |
edi, 32 |
;Переход к следующему элементу списка |
pop |
ecx |
;Восстановление ECX |
loop |
loop0 |
;Цикл по всем элементам списка |
mov |
eax, 1 |
;Установка кода успешного выполнения |
ret |
|
;Выход |
InputList endp
Пример
InputStudent proc |
|
invoke |
StdOut, ADDR mess1 |
invoke |
StdIn, edi, 30 |
invoke |
szLen, edi |
mov |
dx, 2020h |
mov |
[edi+eax-2], dx |
invoke |
StdOut, ADDR mess2 |
invoke |
StdIn, ADDR buff, 10 |
invoke |
atol, ADDR buff |
mov |
BYTE PTR [edi+30], al |
invoke |
StdOut, ADDR mess3 |
invoke |
StdIn, ADDR buff, 10 |
invoke |
atol, ADDR buff |
mov |
BYTE PTR [edi+31], al |
ret |
|
InputStudent endp |
|
;Вывод приглашения ввода ФИО ;Ввод строки в структуру ;Вычисление длины строки ;Замена перевода строки пробелами
;
;Вывод приглашения ввода курса ;Ввод курса ;Преобразование в число ;Запись в поле структуры
;Вывод приглашения ввода балла ;Ввод среднего балла ;Преобразование в число ;Запись в поле структуры ;Выход
Пример
OutputStudent proc |
|
|
|
invoke |
StdOut, esi |
|
;Вывод ФИО |
xor |
eax, eax |
|
;Очистка EAX |
mov |
al, BYTE PTR [esi+30] |
|
;Запись в AL курса |
invoke |
ltoa, eax, ADDR buff |
|
;Преобразование в строку |
invoke |
szCatStr, ADDR buff, ADDR spac |
;Добавление пробела |
|
invoke |
StdOut, ADDR buff |
;Вывод строки |
|
xor |
eax, eax |
|
;Очистка EAX |
mov |
al, BYTE PTR [esi+31] |
|
;Запись в AL сред. балл |
invoke |
ltoa, eax, ADDR buff |
|
;Преобразование в строку |
invoke |
szCatStr, ADDR buff, ADDR endl |
;Добавление перевода строки |
|
invoke |
StdOut, ADDR buff |
;Вывод строки |
|
ret |
|
|
;Выход |
OutputStudent endp end start
Пример 2
В бинарном файле содержится список записей о студентах. Каждая запись содержит: ФИО – строка 30 символов (+1 символ на хранение завершающего нуля), курс – целое число размером 1 байт, успеваемость – целое число размером 1 байт.
Необходимо загрузить список из файла и вывести на экран. Далее у пользователя запрашивается поле и направление сортировки. Список упорядочивается и выводится на экран.
Пример 2 (описание структуры)
include \masm32\include\masm32rt.inc
Student STRUC |
|
|
fio |
db 31 dup(0) |
;Поле «ФИО» |
year |
db 0 |
;Поле «Номер курса» |
rate |
db 0 |
;Поле «Успеваемость» |
Student ENDS |
|
|
Пример 2 (сегмент данных)
.data
mess1 |
db |
'Input file name: ', 0 |
|
mess2 |
db |
'Input sort type (1 - by fio, 2 - by year, 3 - by rate): ', 0 |
|
mess3 |
db |
'Input sort direction (0 - ascending, |
!0 - descending): ', 0 |
mess4 |
db |
'No file!', 0dh, 0ah, 0 |
|
mess5 |
db |
'Incorrect file!', 0dh, 0ah, 0 |
|
mess6 |
db |
'File read error!', 0dh, 0ah, 0 |
|
mess7 |
db |
'Incorrect input!', 0dh, 0ah, 0 |
|
fname |
db |
100 dup(0) |
|
endl |
db |
0dh, 0ah, 0 |
|
spac |
db |
' ', 0 |
|
arrptr |
dd |
0 |
|
arrnum |
dd |
0 |
|
buff |
db |
100 dup(0) |
|
delim |
db |
'-------------------------------------------------------- |
', 0dh, 0ah, 0 |
|
|
|
|
Пример 2 (программа – начало)
start:
cls |
;Очистка экрана |
call |
main ;Вызов главной процедуры |
inkey |
;Ожидание нажатия клавиши |
exit |
;Завершение программы |
Пример 2 (Процедура main – ввод имени файла и его проверка)
main proc |
|
|
|
|
|
|
push |
ebp |
;Настройка базы |
|
|
|
mov |
ebp, esp |
; |
|
|
|
invoke |
StdOut, ADDR mess1 ;Вывод приглашения к вводу имени файла |
|||
|
invoke |
StdIn, ADDR fname, 99 |
;Ввод имени файла |
||
|
lea |
edx, fname ;Установка EDX на имя файла |
|||
|
add |
eax, edx |
;Установка EAX на конец строки имени файла |
||
|
mov |
BYTE PTR [eax-2], 0 |
;Запись завершающего нуля вместо \n |
||
|
invoke |
filesize, ADDR fname |
;Определение размера файла |
||
|
cmp |
eax, -1 |
;Если файл существует, то |
||
|
jne |
next0 |
;переход на next0 |
|
|
|
invoke |
StdOut, ADDR mess4 ;Вывод сообщения об отсутствии файла |
|||
|
pop |
ebp |
;Восстановление EBP |
||
|
ret |
;Завершение main |
|
|
|
next0: |
|
|
|
|
|
|
mov |
ecx, 33 |
;Заносим в ECX размер структуры |
||
|
xor |
edx, edx |
;Очистка EDX |
|
|
|
div |
ecx |
;Делим EDX:EAX на ECX |
||
|
or |
edx, edx |
;Проверка остатка от деления на ноль |
||
|
jz |
next1 |
;Если ноль, то переход на next1 |
||
|
invoke |
StdOut, ADDR mess5 ;Вывод сообщения о некорректном файле |
|||
|
pop |
ebp |
;Восстановление EBP |
||
|
ret |
;Завершение main |
|
|
|
|
|
|
|
|
|