Підпрограма , що відповідає за утворення матриці «В».



Create_B_Matrix :

mov si , 0

mov bx , 0

mov cx , [N]   

external_BM :

push cx

mov cx, [N]

mov bx , si

mov di , 0

internal_BM:

mov dx , A[si]

mov ax , A[si+2]

add dx , ax

mov B[si],dx

cmp cx , 2

jne afterthis

dec cx

mov dx , A[si+2]

mov ax , A[BX]

add dx , ax

mov B[si+2] , dx

afterthis:

add si ,2

loop internal_BM

pop cx

add si ,2

loop external_BM

ret

 

Принцип роботи : йдемо рядками матриці «A» , та утворюємо відповідні рядкові елементи матриці «В» шляхом додавання і –го елементу до і+1 елементу відповідного рядку , якщо і-ий елемент рядку є останній то додаємо до нього перший елемент цього ж рядку .

Підпрограма , що відповідає за відображення та обробку пунктів головного меню .

Mainmenu:

call ryso4ka

mov ah ,09h

lea dx ,message_oberit

int 21h

lea dx , m_1

int 21h

lea dx , m_2

int 21h

lea dx , m_3

int 21h

lea dx , m_4

int 21h

call ryso4ka

mov ah ,01h

int 21h

call endl

cmp al , '1'

je gomsg1

cmp al , '2'

je gomsg2

cmp al , '3'

je gomsg3

cmp al , '4'

je gomsg4

mov ah ,09h

lea dx ,message_incorect_input

int 21h

call exit

gomsg1:

call LetsGetSum

mov ah , 09h

lea dx ,message_count_of_elements

int 21h

mov ax , [Count_of_elements]

call write_element

call endl

mov ah ,09h

lea dx , message_sum_is

int 21h

mov ax , [Sum]

call write_element

call endl

call exit

gomsg2:

call LetsChangeElements

call outputing_matrix

call exit

gomsg3:

call CountingZeroes

call exit

gomsg4:

call Create_B_Matrix

call outputing_B_matrix

call exit

ret

Принцип роботи : виводимо відповідні пункти меню на дисплей , що являють собой вище поставлені завдання щодо обобки матриць та обробляємо обраний користувачем варіант .

 

 


РЕАЛІЗАЦІЯ ПРОГРАМИ

Завдання №1.

Model Small

Stack 256

DATASEG

N dw ?

Sum dw ?

i dw ?

Count_of_elements dw ?

A dw 10 dup (10 dup (?))

B dw 10 dup (10 dup (?)) ; матриця для виконання віднімання

const_matrix dw 87,22,43,21,99,91,11,17,55,22,44,0,18,21,33,0

matrix_B dw 100 dup (100 dup (?))

message_endl db 13,10,'$'

message_inputmas db 'please enter N , NxN size of matrix: $'

message_first_part_inp db 'Please enter [$'

message_second_part_inp db '] matrix element :$'

message_sum_is db 'suma parnyh= $'

message_count_of_elements db 'vsiogo elementiv - $'

message_count_of_zeroes db 'Nuliv u stovpci #$'

message_ryso4ka db '--------------------------------------------------',13,10,'$'

message_oberit db 'Please choose any punkt of menu ',13,10,'$'

mes_choose_1 db '1 - load from const matrix',13,10,'$'

mes_choose_2 db '2 - use keyboard to input matrix',13,10,'$'

message_incorect_input db 'Incorrect input please try again ',13,10,'$'

m_1 db '1 - Count the number of odd items and their sum',13,10,'$'

m_2 db '2 - Replace the matching items on 0',13,10,'$'

m_3 db '3 - Number of colum that consist of most elements that = 0',13,10,'$'

m_4 db '4 - Create B Matrix with sum [i]+[i+1] elements',13,10,'$'

exCode DB 0

CODESEG

Begin:

mov ax,@data

       mov ds, ax

;виводимо повідомлення "Оберіть відповідний пункт меню",

       ;а також самі пункти меню , тобто

       ;"1 - Користуватися константною матрицею"

       ;"2 - Ввести матрицю з клавіатури "

       call ryso4ka

       mov ah, 09h

       lea dx , message_oberit

       int 21h

       lea dx , mes_choose_1

       int 21h

       lea dx , mes_choose_2

       int 21h

       ;отримуємо та аналізуємо введені дані

       mov ah ,01h

       int 21h

       call endl

       cmp al , '1' ;якщо введений символ один

       je ConstLoad ;то переходимо до мітки ConstLoad

       cmp al , '2'  ;якщо введений символ 2 то переходимо

       je InputMatrix ;до мітки InputMatrix

       ; в іншому випадку виводимо повідомлення про помилку

       ; вхідних даних та закінчуємо роботу програми

       mov ah ,09h  

       lea dx ,message_incorect_input

       int 21h

       call exit

 

;Завантаження з константи

ConstLoad :

       call load_from_constant ;в матрицю А значення константної матриці

       call outputing_matrix ;виведення матриці

       call Mainmenu                   ;виведення головного меню

;Введення з клавіатури                    

InputMatrix :

       mov ah , 09h           ; Повідомлення про

       lea dx , message_inputmas; введення N

       int 21h               ; Кількості елементів матриці N*N

  

       call inp_val            ; Ввести значення з клавіатури, що буде в регістрі bx

       mov [N] , bx         ; Запам"ятати в N введене значення

       call endl                

 

       call inputing_matrix ;введення матриці з клавіатури

       call outputing_matrix ;виведення матриці

       call Mainmenu       ;виведення головного меню

                       

;Вихід із програми               

Exit:

 

       mov ah, 04Ch

       mov al , [exCode]

       int 21h

;Зміщення каретки    

endl:

       push ax

       push dx

       mov ah , 09h

       lea dx , message_endl

       int 21h

       pop dx

       pop ax

ret

; Виведення роздільника типу "--------"

ryso4ka:

       push ax

       push dx

       mov ah , 09h

       lea dx , message_ryso4ka

       int 21h

       pop dx

       pop ax

ret

; виведення числа із регістру ах

write_element :

       push cx          

       push -1

podgotovka:   

       xor dx, dx      

       mov cx , 10

div cx          

       push dx          

       cmp ax , 0

       jne podgotovka

       mov ah ,02h

vyvedennja:

       pop dx

       cmp dx , -1

       je goout

 

       add dl , 30h

       int 21h

       jmp vyvedennja         

goout:

       pop cx

ret

 

;ВВедення значення з клавіатури

; що залишиться в вх

inp_val:

       xor bx, bx

       push ax 

inp_n:

       mov ah , 01h

       int 21h

       cmp al , 13

       je after_inp_n

       sub al , 48

       push ax

       mov ax , bx

       mov bx , 10

       mul bx

       mov bx , ax

       pop ax

       add bl , al

       jmp inp_n

after_inp_n:

       pop ax

ret

 

 

;Виведення А матриці на екран

outputing_matrix :

       call ryso4ka

       mov si , 0

       mov ax , [N]

       mul ax

       mov cx , ax

       mov bx , [N]

GoOutput :

       mov ax , A[si]

       call write_element

       mov ah , 02h

       mov dl ,' '

       int 21h

       add si , 2

       dec bx

       cmp bx , 0

       jne gO_

       call endl

       mov bx , [N]

gO_:

       loop GoOutput

ret

;Виведення В матриці на екран

outputing_B_matrix :

       call ryso4ka

       mov si , 0

       mov ax , [N]

       mul ax

       mov cx , ax

       mov bx , [N]

GoOutput_ :

       mov ax , B[si]

       call write_element

       mov ah , 02h

       mov dl ,' '

       int 21h

       add si , 2

       dec bx

       cmp bx , 0

       jne gO__

       call endl

       mov bx , [N]

gO__:

       loop GoOutput_

ret

;ВВедення матриці

inputing_matrix :                               

       xor bx , bx                                                                

       xor si , si                                                                   

       mov ax , [N]                                                             

       mul ax

       mov cx , ax

       call ryso4ka

input_go:        

       mov ah , 09h

       lea dx , message_first_part_inp

       int 21h

       mov ax ,[N]

       mul ax

       sub ax , cx

       inc ax

       call write_element

       mov ah , 09h

       lea dx , message_second_part_inp

       int 21h

       call inp_val

       mov A[si] ,bx

       add si , 2

       call endl

       loop input_go          

ret

;Завантаження в матрицю А значень із константної матриці

load_from_constant:

       mov [N] , 4

       mov cx , [N]

       lea di , const_matrix

       mov bx , 0

external_load:

       push cx

       mov cx , [N]

       mov si , 0

       internal_load:

       mov dx , [di]

       mov A[bx][si], dx

       add si , 2

       add di , 2

       loop internal_load

       pop cx

       add bx ,8

       loop external_load

ret

;Підраховуємо суму парних елементів та їх кількість , та

;Заносимо їх значення в змінні SUm та count_of_elements

LetsGetSum:

       call ryso4ka

       mov cx , [N]

       mov bx , 0

external_GetSum:

       push cx

       mov cx , [N]

       mov si , 0

internal_GetSum:

       mov ax , A[bx][si]

       mov dl , 2

div dl

       cmp ah, 0

       jne ifNeParne

       mov dx , [Sum]

       add dx , A[bx][si]

       mov [Sum] , dx

       mov dx , [count_of_elements]

       inc dx

       mov [count_of_elements] , dx

ifNeParne:

       add si , 2

       loop internal_GetSum

       pop cx

       mov ax , [N]

       mov dx ,2

       mul dx

       add bx ,ax

       loop external_GetSum

ret

;Замінюємо парні елементи на 0

LetsChangeElements:

mov cx , [N]

       mov bx , 0

external_CH:

       push cx

       mov cx , [N]

       mov si , 0

internal_CH:

       mov ax , A[bx][si]

       mov dl , 2

       div dl

       cmp ah, 0

       je ifParne

       mov dx , 0

       mov A[bx][si], dx

ifParne:

       add si , 2

       loop internal_CH

       pop cx

       mov ax , [N]

       mov dx ,2

       mul dx

       add bx ,ax

       loop external_CH

ret

;Обраховуємо кількість нулів у стовпцях матриці

CountingZeroes:

call ryso4ka

mov cx , [N]

mov di , 0

mov [i] , 0                  

ex_:

       mov si , di

       mov bx , 0

       push cx

       mov cx ,[N]

in_:

       mov dx , A[si]

       cmp dx , 0

       jne after_

       inc bx

after_:

       mov ax , [N]

       mov dx ,2

       mul dx

       add si ,ax

       loop in_

       pop cx

       add di ,2

       mov ah ,09h

       lea dx ,message_count_of_zeroes

       int 21h

       mov dx , [i]

       inc dx

       mov [i] ,dx

       mov ax , [i]

       call write_element

       mov ah , 02h

       mov dl , ' '

       int 21h

       mov ax , bx

       call write_element

       call endl

loop ex_

ret

; виведення головного меню

Mainmenu:

       call ryso4ka

       mov ah ,09h

       lea dx ,message_oberit

       int 21h

       lea dx , m_1

       int 21h

       lea dx , m_2

       int 21h

       lea dx , m_3

       int 21h

       lea dx , m_4

       int 21h

       call ryso4ka

       mov ah ,01h

       int 21h

       call endl

       cmp al , '1'

       je gomsg1

       cmp al , '2'

       je gomsg2

       cmp al , '3'

       je gomsg3

       cmp al , '4'

       je gomsg4

       mov ah ,09h

       lea dx ,message_incorect_input

       int 21h

       call exit

gomsg1:

       call LetsGetSum

       mov ah , 09h

       lea dx ,message_count_of_elements

       int 21h

       mov ax , [Count_of_elements]

       call write_element

       call endl

       mov ah ,09h

       lea dx , message_sum_is

       int 21h

       mov ax , [Sum]

       call write_element

       call endl

       call exit

gomsg2:

       call LetsChangeElements

       call outputing_matrix

       call exit

gomsg3:

       call CountingZeroes

       call exit

gomsg4:

       call Create_B_Matrix

       call outputing_B_matrix

call exit

ret

 

; Утворення матриці В

;шляхом додавання до кожного елементу

;рядка наступного елементу рядка

;до останнього додавши 1ший

 

Create_B_Matrix :

       mov si , 0

       mov bx , 0

       mov cx , [N]   

external_BM :

       push cx

       mov cx, [N]

       mov bx , si

       mov di , 0

internal_BM:

       mov dx , A[si]

       mov ax , A[si+2]

       add dx , ax

       mov B[si],dx

       cmp cx , 2

       jne afterthis

       dec cx

       mov dx , A[si+2]

       mov ax , A[BX]

       add dx , ax

       mov B[si+2] , dx

afterthis:

       add si ,2

       loop internal_BM

       pop cx

       add si ,2

       loop external_BM

ret

 

END Begin

 

Завдання№2.

 

Model Small

Stack 256

DATASEG

 

MessageInputString db 'Please input the string $' ; повідомлення "введіть рядок"

MessageError db 'Error , please try again $';повід. "помилка ,попробуйте ще раз"

MessagePoint db , 'The string was inputed without error $' ; пов "рядок введено без помилки"

MessageEndl db 13,10,'$'

exCode DB 0

CODESEG

Begin:

       mov ax,@data

       mov ds, ax

 

       mov ah , 09h                                                                    ;виводимо повідомлення про

       lea dx , MessageInputString ;початок введення рядка

       int 21h                                                                                          ;із клавіатури

 

       call endl ; перевести каретку на початок наступного рядка

           

INPUT:       ; введення рядку з клавіатури

       mov bl , al

       mov ah , 01h                    ; функція 21го переривання

       int 21h                   ; що відповідає за введення символу з клавіатури

           

       cmp al , '.'  ; порівнюємо введений символ з "."

       je AFTER  ; якщо "." то перейти на мітку "AFTER"

           

       cmp al , ','

       jne INPUT

       cmp al ,bl

       jne INPUT

       call endl

       mov ah ,09h

       lea dx , MessageError

       int 21h

       jmp exit

           

AFTER:       

       call endl

       mov ah ,09h

       lea dx , MessagePoint

       int 21h

Exit:

 

       mov ah, 04Ch

       mov al , [exCode]

       int 21h

 

endl:

       push ax

       push dx

       mov ah , 09h

       mov dx , offset MessageEndl

       int 21h

       pop dx

       pop ax

ret

 

END Begin

 

 


 

РЕЗУЛЬТАТИ РОБОТИ

 


Дата добавления: 2018-10-27; просмотров: 167; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!