- •Лекция 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 (сравнение по убыванию ФИО)
- •Сравнение по полю «Курс»
- •Сравнение по полю «Успеваемость»
- •Процедура обмена
- •Процедура сортировки - продолжение
Пример 1
inputArray |
proc |
|
invoke StdOut, ADDR mess1 |
||
invoke |
StdIn, ADDR buff, 20 |
|
invoke |
atol, ADDR buff |
|
cmp |
eax, 100 |
|
jle |
next0 |
|
xor |
eax, eax |
|
ret |
|
|
next0: |
|
|
mov |
num, eax |
|
invoke StdOut, ADDR mess2 |
||
xor |
ebx, ebx |
|
loop0: |
|
|
invoke |
StdIn, ADDR buff, 20 |
|
invoke |
atol, ADDR buff |
|
mov |
array[ebx*4], eax |
|
inc |
ebx |
|
cmp |
ebx, num |
|
jnz |
loop0 |
|
mov |
eax, 1 |
|
ret |
|
|
inputArray |
endp |
findMaxArray proc
xor |
ebx, ebx |
mov |
eax, array |
loop0: |
|
mov |
edx, array[ebx*4] |
cmp |
edx, eax |
jl |
next0 |
mov |
eax, edx |
next0: |
|
inc |
ebx |
cmp |
ebx, num |
jnz |
loop0 |
ret findMaxArray endp end start
Пример 2
Найти в целочисленном массиве значение с максимальной суммой цифр в десятичной системе счисления. Размер массива и его элементы вводятся пользователем. Массив создается в динамической памяти.
Найденный элемент и сумма его цифр выводится в формате: элемент – сумма.
При реализации использовать передачу параметров в процедуры и локальные переменные.
Пример 2
include \masm32\include\masm32rt.inc
.data |
|
|
mess0 |
db |
'Input number of elements: ', 0 |
mess1 |
db |
'Input elements:', 0dh, 0ah, 0 |
mess2 |
db |
'Max summa: ', 0 |
endl |
db |
' ', 0dh, 0ah, 0 |
spac |
db |
' - ', 0 |
reslt |
db |
'Result: ', 100 dup(0) |
buff |
db |
20 dup(0) |
.code |
|
|
start:
сls
call main inkey exit
Пример 2 (процедура main)
main proc |
|
|
|
|
|
push |
ebp |
|
|
|
mov |
ebp, esp |
|
|
|
sub |
esp, 12 |
;Резервирование места под переменные |
|
|
mov |
ebx, ebp |
;Передача адреса ячейки куда |
|
|
sub |
ebx, 4 |
;необходимо записать количество |
|
|
push |
ebx |
;элементов |
|
|
call |
CreateArray |
|
|
|
or |
eax, eax |
;Проверка создания массива |
|
|
jz |
exit0 |
;Если не создан, то выход |
|
|
mov |
[ebp-8], eax |
;Сохранение адреса массива |
|
|
push |
eax |
;Передача адреса массива в параметре |
|
|
push |
[ebp-4] |
;Передача размера массива в параметре |
|
|
call |
InputArray |
|
|
|
mov |
ebx, ebp |
;Передача адреса ячейки куда |
|
|
sub |
ebx, 12 |
;необходимо записать значение элемента |
|
|
push |
ebx |
;с максимальной суммой цифр |
|
|
push |
[ebp-8] |
;Передача адреса массива в параметре |
|
|
push |
[ebp-4] |
;Передача размера массива в параметре |
|
|
call |
FindMax |
|
|
|
|
|
|
|
Пример 2 (процедура main)
push |
eax |
|
push |
[ebp-8] |
;Передача адреса массива в параметре |
call |
FreeArray |
|
invoke |
ltoa, [ebp-12], ADDR buff |
|
invoke |
szCatStr, ADDR reslt, ADDR buff |
|
invoke |
szCatStr, ADDR reslt, ADDR spac |
|
pop |
eax |
|
invoke |
ltoa, eax, ADDR buff |
|
invoke |
szCatStr, ADDR buff, ADDR endl |
|
invoke |
szCatStr, ADDR reslt, ADDR buff |
|
invoke |
StdOut, ADDR reslt |
|
exit0: |
|
|
add |
esp, 12 |
|
pop |
ebp |
|
ret |
|
|
main endp |
|
|
Пример 2 (создание массива)
CreateArray |
proc |
|
push |
ebp |
|
mov |
ebp, esp |
|
invoke |
StdOut, ADDR mess0 |
;Вывод приглашения |
invoke |
StdIn, ADDR buff, 10 |
;Ввод строки |
invoke |
atol, ADDR buff |
;Преобразование в число |
or |
eax, eax |
;Проверка на ноль |
jnz |
next0 |
|
pop |
ebp |
|
ret |
4 |
|
next0: |
|
|
mov |
ebx, [ebp+8] |
;Запись в параметр по ссылке |
mov |
[ebx], eax |
;количество элементов |
shl |
eax, 2 |
|
invoke |
Alloc, eax |
;Выделение памяти |
pop |
ebp |
|
ret |
4 |
|
CreateArray |
endp |
|
|
|
|
Пример 2 (ввод элементов массива)
InputArray |
proc |
|
|
|
|
push |
ebp |
|
|
|
mov |
ebp, esp |
|
|
|
invoke |
StdOut, ADDR mess1 |
;Вывод приглашения |
|
|
mov |
ecx, [ebp+8] |
;Получение количества элементов |
|
|
mov |
ebx, [ebp+12] |
;Получение адреса массива |
|
loop0: |
|
|
|
|
|
push |
ecx |
|
|
|
invoke |
StdIn, ADDR buff, 10 |
;Ввод строки |
|
|
invoke |
atol, ADDR buff |
;Преобразование в число |
|
|
pop |
ecx |
|
|
|
mov |
[ebx], eax |
;Сохранение в массиве |
|
|
add |
ebx, 4 |
;Переход на следующий элемент |
|
|
loop |
loop0 |
Альтернатива: |
|
|
pop |
ebp |
mov |
[ebx][ecx*4]-4 |
|
ret |
8 |
|
|
InputArray |
endp |
|
|
|
|
|
|
|
|
Пример 2 (поиск значения)
FindMax |
proc |
push |
ebp |
mov |
ebp, esp |
mov |
ecx, [ebp+8] |
mov |
ebx, [ebp+12] |
mov |
edi, [ebp+16] |
xor |
edx, edx |
loop0: |
|
push |
ecx |
push |
[ebx] |
call |
GetSumm |
cmp |
edx, eax |
jg |
next1 |
mov |
edx, eax |
push |
[ebx] |
pop |
[edi] |
next1: |
|
add |
ebx, 4 |
pop |
ecx |
loop |
loop0 |
mov |
eax, edx |
pop |
ebp |
ret |
12 |
FindMax |
endp |
;Передача значения элемента
;Сравнение с текущим максимумом
;Сохранение нового максимума
Пример 2 (вычисление
|
суммы) |
|
|
|
GetSumm |
proc |
|
|
|
|
push |
ebp |
|
|
|
mov |
ebp, esp |
|
|
|
push |
edx |
|
|
|
push |
ebx |
|
|
|
xor |
ebx, ebx |
;Очистка регистра для хранения суммы |
|
|
mov |
eax, [ebp+8] |
;Чтение значения параметра |
|
|
mov |
ecx, 10 |
|
|
loop1: |
|
|
|
|
|
xor |
edx, edx |
;Очистка EDX |
|
|
div |
ecx |
;Деление на 10 |
|
|
add |
ebx, edx |
;Прибавление к сумме остатка от деления |
|
|
or |
eax, eax |
;Проверка на ноль |
|
|
jnz |
loop1 |
;Переход если не ноль |
|
|
mov |
eax, ebx |
|
|
|
pop |
ebx |
|
|
|
pop |
edx |
|
|
|
pop |
ebp |
|
|
|
ret |
4 |
|
|
GetSumm |
endp |
|
|
|
|
|
|
|
|
Пример 2 (уничтожение массива)
FreeArray |
proc |
push |
ebp |
mov |
ebp, esp |
mov |
eax, [ebp+8] |
invoke |
Free, eax |
pop |
ebp |
ret |
4 |
FreeArray |
endp |
end start |
|