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

2) Практична частина

1.Завдання

13. Побудувати вектор D, елементи якого дорівнюють сумі елементів рядків матриці B(m,m), що розміщені вище головної діагоналі

Блок-схема: альтернативный процесс 76 Прямая со стрелкой 91

SI = BX + 1

Блок-схема: решение 94 Прямая со стрелкой 97

mas[BX] = mas[BX] + matr[BX][SI]

SI = SI + 1

Прямая соединительная линия 102 Прямая со стрелкой 104 Прямая соединительная линия 105 Блок-схема: данные 15 Блок-схема: решение 16 Прямая соединительная линия 20

Блок-схема: данные 81 Прямая соединительная линия 89 Прямая со стрелкой 90 Прямая соединительная линия 43

так

Прямая соединительная линия 88 ні

ні

так

Прямая соединительная линия 96 Прямая соединительная линия 103

BX = BX + 1

ні

Прямая со стрелкой 24 Прямая соединительная линия 29 Прямая соединительная линия 36 ні

2.Опис алгоритму:

  1. Індекс рядка перевіряємо, щоб він був не більше ніж індекс передостаннього рядка. Якщо це не так то на 4.

  2. Для кожного індексу стовпчика перевіряємо, щоб він був не більше ніж індекс останнього стовпчика. Якщо це не так, то збільшуємо індекс рядка на 1, на переходимо до кроку 1.

  3. Рахуємо суму елементів рядка з поточними індексами, та зберігаємо її у шуканий масив з індексом поточного рядка матриці. Збільшуємо індекс рядка на 1, на переходимо до кроку 1.

  4. Вивід елементів масиву. Вихід з програми.

3. Код програми

.386 ; використання інструкцій 386 процесора

.model flat, stdcall ;використання моделі пам'яті flat і способи передачі аргументів у функції

stdcall

option casemap :none

include \masm32\include\windows.inc ; опис констант

include \masm32\include\kernel32.inc ; опис прототипів функцій

include \masm32\include\masm32.inc

include \masm32\include\user32.inc

includelib \masm32\lib\kernel32.lib ;підключені бібліотеки

includelib \masm32\lib\masm32.lib

includelib \masm32\lib\user32.lib

.data

bufferforstring db 10 dup(0)

titlestring db "Результат",0

szformat db "Number = %u",0

matrLeng dw 0 ;загальна кількість елементів матриці

bsize equ 4

buf dw 2 dup(0) ;буфер читання

k1 dd 2 dup(0) ;буфери для виводу

k2 dd 2 dup(0)

stdout dword ? ; дескриптор пристрою виводу

stdin dword ? ; дескриптор пристрою вводу

cRead byte ? ;кількість прочитаних символів

Press db "Vvedite razmer ",0Dh,0Ah, 0 ; повідомлення

PressPPV db "PPV ",0Dh,0Ah, 0

PressRsm db "razmer ",0Dh,0Ah, 0

Presselm db "element ",0Dh,0Ah, 0

Presskol db "koluchestvo elementov ",0Dh,0Ah, 0

PressEx db "element vektora ",0Dh,0Ah, 0

Pr db " ",0Dh,0Ah, 0

msg db ' $'

matrSize dw 0

masSize dw 0

i dw 0

j dw 0

mas db 10 dup (0)

matr db 30 dup (0)

.code

start:

invoke GetStdHandle, STD_OUTPUT_HANDLE ;отримання дескриптора виводу

mov stdout, eax

invoke GetStdHandle, STD_INPUT_HANDLE ;отримання дескриптора вводу

mov stdin, eax

mov SI,0

xor dI,dI

invoke StdOut, addr Press ; вивід запрошення до вводу розміру масиву

JMP newline

newlineel:

invoke StdOut, addr Presselm ; вивід запрошення до вводу елементу масиву

newline:

invoke ReadConsole,stdin, addr buf,\ ;ввід даних

bsize, addr cRead, NULL

cmp cRead,2 ;перевірка на введений пустий рядок

jnz rasm ;якщо ні переходимо по мітці

jmp exit ;інакше виходимо

rasm:

cmp si,0 ;перевірка чи був введений розмір масиву

je rasm1 ;якщо ні переходимо по мітці, інакше йдемо далі

Invoke atol,ADDR buf ; Функція перетворення рядка в число (результат в

AX )

mov matr[di],al ;зберігаємо в масив

inc di ;лічильник індексу елементів масиву

inc si ;лічильник введених елементів

cmp si,matrLeng ;перевірка закінчення масиву

jbe newlineel ;якщо ні, переходимо до введення наступного

елемента

jmp osn ;інакше переходимо до основної частини

rasm1:

Invoke atol,ADDR buf ; Функція перетворення рядка в число (результат в

AX )

mov matrSize,ax ;зберігаємо в matrSize

mov masSize,ax

sub masSize,1 ;визначаємо masSize як число, менше на 1 від

matrSize

mov bx,ax ; розрахунок загальної кількості елементів

(результат в ах->matrLeng)

mul bx

mov matrLeng,ax

inc si ;показник введеного розміру масиву

add k1,eax

Invoke dwtoa,k1,ADDR k2 ;Процедура перетворення числа в рядок

invoke StdOut, addr Presskol ;вивід повідомлення

invoke StdOut, addr k2 ;вивід загальної кількості елементів масиву

invoke StdOut, addr Pr

JMP newlineel ;перехід до введення елементів масиву

osn: xor cx,cx

xor ebx,ebx

xor esi,esi

xor di,di

b1: mov cx,i

add cx,1

cmp cx,matrSize

jae vuhod

b2: mov cx,i

mov j,cx

add j,1

b3: mov cx,matrSize

cmp j,cx

jae addI

b4: mov al,BYTE PTR [matrSize]

mul BYTE PTR [i]

mov bx,ax

mov si,j

mov cl,matr[ebx][esi]

push bx

mov bx,i

add mas[bx],cl

pop bx

add j,1

jmp b3

addI: add i,1

jmp b1

vuhod: xor eax,eax ;очистка регістрів

xor esi,esi

mov di,masSize ;збереження розміру вектору

vuvod: mov k1,0 ;очищення

mov al,mas[si] ;організація перетворення числа в рядок і виводу результату

add k1,eax

Invoke dwtoa,k1,ADDR k2 ;Процедура перетворення числа в рядок

invoke StdOut, addr PressEx

invoke StdOut, addr k2 ;вивід результату

invoke StdOut, addr Pr

inc si ;збільшення на індекс нового елементу вектору

dec di

cmp di,1 ;перевірка на закінчення вектора,

jnl vuvod ;організація циклу по кількості елементів вектору

exit: ;invoke wsprintf,addr bufferforstring,addr szformat,mas[0]

;invoke MessageBox,0,ADDR bufferforstring,ADDR titlestring,MB_OK ;выводим резульат

invoke ExitProcess, 0 ;вихід з програми з кодом повернення 0

end start

Список літератури

  1. Кіп Ірвіна. Мова асемблера для процесорів Intel = Assembly Language for Intel-Based

  2. Юров Ст І. Assembler. Практикум. : підручник для вузів / 2-е видавництво СПб.: «Пітер», 2004.

  3. Річард Саймон. Microsoft Windows API Довідник системного програміста.

  4. Ассемблер. Самоучитель Assembler - Питер

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