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

Пример

.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