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

Пример 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