Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторна робота СП.docx
Скачиваний:
1
Добавлен:
08.09.2019
Размер:
3.28 Mб
Скачать

Лабораторна робота 7.

Тема: Обробка масивів даних

Цель: Вивчити способи обробки масивів даних мовою

асемблера.

Завдання 2

; Задан массив A[N] из элементов типа Short Integer (целое 8-разрядное со

; знаком). Составить программу нахождения максимального и минимального

; элемента. Разместить индексы максимального и минимального элемента в отдель-

; ных ячейках памяти.

; Индекс максимального элемента раместим в ячейке IndMax, а индекс минимального

; элемента разместим в ячейке IndMin.

model tiny

.code

org 100h

Start:

mov si, 0 ; Инициализируем счётчик цикла.

mov ch, -128 ; Инициализируем максимальное значение массива.

mov cl, 127 ; Инициализируем минимальное значение массива.

M1: mov al, A[si]

cmp al, ch ; Поиск максимума.

jle M2

mov ch, al ; Текущий элемент больше максимума.

mov IndMax, si ; Запоминаем его номер.

inc IndMax ; Корректировка номера, т.к. si=i-1.

M2: cmp al, cl ; Поиск минимума.

jge M3

mov cl, al ; Текущий элемент меньше минимума.

mov IndMin, si ; Запоминаем его номер.

inc IndMin ; Корректировка номера, т.к. si=i-1.

M3: inc si ; Команды завершения тела цикла.

cmp si, N

jb M1

ret

N dw 10 ; Размерность массива.

A db -3, 5, 2, 6, 11, 5, -4, 127, -9, 10

IndMax dw ? ; Номер максимального элемента в A.

IndMin dw ? ; Номер минимального элемента в A.

end Start

Завдання 3

include \masm32\include\windows.inc

include \masm32\include\kernel32.inc

include \masm32\include\fpu.inc

include \masm32\include\user32.inc

include \masm32\include\msvcrt.inc

includelib \masm32\lib\user32.lib

includelib \masm32\lib\kernel32.lib

includelib \masm32\lib\msvcrt.lib

includelib \masm32\lib\fpu.lib

. Data; директива определения данных

_c dd 24

sum dd 0

max dd 0; запись в 32-разрядную ячейку памяти с именем op1

temp dd 7

frmt db "% d", 0

buf db 50 dup (?)

stdout DWORD?

stdin DWORD?

cRead dd?

mas1 dd 32 dup (0)

nomer dd 0

st1 db "Vvesty masiv:

st2 db "Вывод результата перемещения", 0

st3 db 10 dup (0)

ifmt db "Максимальный элемент =% d. Строка% d перенена в конец массива", 0

. Code; директива начала кода

_start:

lea esi, mas1; загрузки адреса начала массива

mov ecx, _c

m1:

mov ebx, ecx

invoke GetStdHandle, STD_OUTPUT_HANDLE

mov stdout, eax

invoke GetStdHandle, STD_INPUT_HANDLE

mov stdin, eax

invoke WriteConsoleA, stdout, ADDR st1, 14, NULL, NULL; VIVOD ST1

invoke ReadConsole, stdin, ADDR buf, 20, ADDR cRead, NULL; чтение числа как символ

invoke crt_atoi, ADDR buf;превратить символ в число

mov [esi], eax

add esi, 4

mov ecx, ebx

loop m1

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

mov ecx, _c

lea esi, mas1;загрузка адреса начала массива

mov eax, [esi]; загрузки числа

m3:

. IF (eax> max); условие

mov max, eax

add esi, 4; расчет адреса нового числа

mov eax, [esi]

loop m3

. ELSE; иначе

add esi, 4;расчет адреса нового числа

mov eax,[esi]

loop m3; перейти,если ecx и 0

. ENDIF; окончания директивы высокого уровня

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

mov ecx, _c

lea esi, mas1; загрузки адреса начала массива

mov eax, [esi]; загрузки числа

m4:

. IF (eax == max); условие

inc nomer; находим в каком месте находится максимальный элемент

add esi, 4;расчет адреса нового числа

mov eax, [esi]

jmp m5

loop m4

. ELSE; иначе

inc nomer

add esi, 4; расчет адреса нового числа

mov eax, [esi]

loop m4; перейти, если ecx и 0

. ENDIF; окончания директивы высокого уровня

m5:

mov eax,nomer

mov edx,0

div temp; в регистре eax находится число строки - 1

mov edx,0

. IF (eax == 0); условие

mov ebx,24

. ELSEIF (eax == 1); условие

mov ebx,18

. ELSEIF (eax == 2); условие

mov ebx,12

. ELSEIF (eax == 3); условие

mov ebx,6

. ENDIF

mov ecx,6

mov edx,ax

shl edx,2

add ebx,edx

x1: lea esi,mas1; загрузки адреса начала массива

mov edx,[Esi + eax * 4]; загрузки числа

mov [esi + ebx],edx

mov edx,0

mov [esi],edx

add esi,4

loop x1

jmp end_prog

end_prog:

mov ebx,max

inc eax

invoke wsprintf,\

ADDR st3,\

ADDR ifmt,\

ebx,ax

invoke MessageBox, \

NULL, \

addr st3, \

addr st2, \

MB_OK

invoke ExitProcess, 0

ret

end _start; окончания программы