Підпрограма , що відповідає за утворення матриці «В».
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; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!