Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Kursova_Nykytiuk.docx
Скачиваний:
0
Добавлен:
18.09.2019
Размер:
56.36 Кб
Скачать

Завдання 3.

1. В MASM32 написать программу решения задачи.

2. Ввод-вывод реализовать с использованием функций API.

Построить вектор D, каждый элемент которого равен произведению элементов столбцов матрицы X(m,k), деленному на максимальный элемент этого же столбца.

Алгоритм вирішення завдання:

  1. Вводимо розмірність матриці

  2. вводимо елементи матриці

  3. Дивимося на знак кожного елемента матриці, і якщо він від’ємний, то заносимо елемент у вектор

  4. виводимо отриманий вектор

.386

.model flat, stdcall

option casemap:none ;делаем метки чувствительными к регистру

include \masm32\include\windows.inc

include \masm32\include\fpu.inc

include \masm32\include\msvcrt.inc

include \masm32\macros\macros.asm ;подключаем в программу необходимые файлы

uselib comctl32,user32,kernel32,msvcrt ; подключаем необходмые библиотеки

.data ;сегмент данных

hWin dd ? ;неинициализировання переменная размером 4 байта

mas dd 64 dup(0)

num dd ?

vect dd 128 dup(0) ; переменная размером 4 байта, заполняется 128

нулями

st1 db "Елемент вектора Y[%u]=%d", 0 ; текстовая строка размером 1 байт, в конце 0

st2 db 20 dup (0)

st3 db "Виведення вектора поелементно",0

st4 db "Vvedit kilkist radkiv masuvy: ",0

st5 db "Vvedit kilkist stovpciv masuvy: ",0

st6 db "Vvedit element masuvy: ",0

vnum dd 0

four db 4

stdout DWORD ?

stdin DWORD ?

cRead dd ?

m dd ?

n dd ?

buf db 30 dup(?)

.code ;сегмент кода

start:

invoke GetStdHandle, STD_OUTPUT_HANDLE ; вызов функции GetStdHandle макросом invoke

mov stdout, eax ; копирование в переменную stdout значения регистра eax

invoke GetStdHandle, STD_INPUT_HANDLE

mov stdin, eax

invoke WriteConsoleA, stdout, ADDR st4, 30, NULL, NULL ; вывод ST1 в консоль

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

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

mov m,eax ; копировать в переменную m содержимое регистра eax

invoke WriteConsoleA, stdout, ADDR st5, 32, NULL, NULL ; вывод ST1 в консоль

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

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

mov n,eax ; копировать в переменную n содержимое регистра eax

mul m ; умножения регистра ЕАХ на переменную m и помещение результата в

;EDX:EAX

mov num, eax ;копировать в переменную num содержимое регистра eax

lea edi, mas ;Вычисляет эффективный адрес переменной mas и помещает его в

;регистр edi

mov ecx, num ;копировать переменную num в содержимое регистра ecx

m1:

mov ebx,ecx ;копировать содержимое регистра ecx в содержимое регистра ebx

invoke WriteConsoleA, stdout, ADDR st6, 23, NULL, NULL ; вывод ST1 в консоль

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

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

stosd ;Копирует регистр ЕАХ в память по адресу ES:EDI

mov ecx, ebx ;копировать содержимое регистра ecx в содержимое регистра ebx

loop m1 ;Уменьшает регистр ЕСХ на 1 и выполняет переход типа short на метку если

;ЕСХ не равен нулю

mov ecx,num ;копировать в переменную num содержимое регистра ecx

mov esi,offset mas ;в регистр esi смещение переменной mas

mov edi,offset vect ;копировать в регистр edi смещение переменной vect

loop1:

lodsd ;копирует двойное слово из памяти по адресу DS:ESI в регистр ЕАХ

test eax, eax ;устанавливает флаги SF, ZF и PF в соответствии с полученным результатом

jns lbl ; если нет знака, то переход на lbl

stosd ;Копирует регистр ЕАХ в память по адресу ES:EDI

inc vnum ; увеличивает значение vnum на 1

lbl:

loop loop1

mov esi,0 ; поместить в регистр значение 0

mov ecx,vnum

loop2:

push ecx

push esi

mov eax,esi

shr eax,2

invoke wsprintf, addr st2, addr st1, eax, vect[esi]

invoke MessageBox,NULL,addr st2,chr$("Виведення вектора Y поелементно"),0

pop esi ;поместить содержимое регистра esi в стек

pop ecx ; выгрузить содержимое стека в регистр ecx

add esi,4 ; прибавить к значению в 4 esi

loop loop2

invoke ExitProcess,0 ; возвращение управления ОС Windows

end start

Тут вы можете оставить комментарий к выбранному абзацу или сообщить об ошибке.

Оставленные комментарии видны всем.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]