Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Primer_kontr._raboty_208_FGOS_.doc
Скачиваний:
12
Добавлен:
16.11.2019
Размер:
318.98 Кб
Скачать

Тема №3 « Работа с массивами и стеком на языке ассемблера»

Условие задачи

Дан двумерный массив. Размер массива и его элементы вводятся пользователем с клавиатуры. Результат работы программы выводится на экран.

Найти и вывести определитель матрицы. Все элементы матрицы, значение которых больше определителя уменьшить на 20%, элементы, значение которых меньше увеличить на 30%.

Исходный текст программы

MASM

model small

JUMPS

.stack 256

.data

message1 db "Введите размер массива: $"

message2 db "Введите массив: $"

message3 db "Определитель = $"

message4 db "Матрица после изменения:",13,10,"$"

n db ?

nn db ?

mas1 db 400 dup(?)

mas2 db 400 dup(?)

i db 0

j db 0

k db 0

h db 0

p db 0

.code

main:

mov ax,@data ; присваиваем ds адрес начала сегмента данных

mov ds,ax

mov ah,9h ; вывод приглашения к вводу

lea dx,message1

int 21h

inputN:

mov ah,1

int 21h ; ввод символа с клавиатуры

AfterPressN:

cmp al,13 ; проверка на нажатие Enter

je endInputN ; если нажат Enter конец ввода

sub al,30h

mov bl,al

mov bh,10

mov al,n

xor ah,ah

add al,bl ; суммируем с введенной цифрой

mov n,al

endInputN:

mov al,n

mul n

mov nn,al ; находим число элементов в массиве

; перевод строки

mov ah,2 ; заносим в ah номер функции

mov dl,10 ; в dl - код перевода строки

int 21h ; вывод символа

mov ah,9h ; вывод приглашения к вводу

lea dx,message2

int 21h

; заполнение массива

mov si,0 ; адрес смещения относительно начала

mov cl,nn ; счетчик цикла

create:

xor dl,dl

inputDl:

mov ah,1

int 21h ; ввод символа с клавиатуры

AfterPressDl:

cmp al,13 ; проверка на нажатие Enter

je endInputDl ; если нажат Enter конец ввода

sub al,30h

mov bh,10

mov al,dl

xor ah,ah

mul bh ; умножаем уже введенное число на 10

add al,bl ; суммируем с введенной цифрой

mov dl,al

jmp inputDl

endInputDl:

mov mas1[si],dl ; записываем в массив число

mov mas2[si],dl

; перевод строки

mov ah,2 ; заносим в ah номер функции

mov dl,10 ; в dl - код перевода строки

int 21h ; вывод символа

end_loop: ; окончание цикла

inc si ; увеличиваем смещение

loop create ; цикл по счетчику cl

xor bx,bx

call outMas ; вывод матрицы до изменения

mov ah,10h ; ожидаем нажатия клавишы

int 16h

; Приводим матрицу к диагональному виду для поиска определителя

mov i,0

cycle1: ; цикл по строкам

mov al,i

mov j,al

inc j

cycle2: ; цикл по строкам

xor ah,ah

mov al,j

mov bl,n

mul bl

add al,i

mov si,ax

xor ah,ah

mov al,i

mul bl

add al,i

mov bx,ax

mov al,mas2[si]

mov cl,mas2[bx]

cmp cl,0

je endCycle3

idiv cl

mov k,al ; находим k = mas[j][i]/mas[i][i]

mov h,0

cycle3:

xor ah,ah

mov al,j

mov bl,n

mul bl

add al,h

mov si,ax

xor ah,ah

mov al,i

mul bl

add al,h

mov bx,ax

mov al,mas2[bx]

mov bl,k

mul bl

mov cl,mas2[si]

sub cl,al

mov mas2[si],cl ; mas[j][h] = mas[j][h] - mas[i][j]*k

inc h

mov al,h

cmp al,n

jb cycle3

EndCycle3:

inc j

mov al,j

cmp al,n

jb cycle2 ; внутренний цикл пока j < n

inc i

mov al,i

cmp al,n

jb cycle1 ; внешний цикл пока i < n

; находим определитель, перемножая элементы на диагонали диагональной матрицы

mov al,n

dec al

mov i,al

mov p,1

cycle4:

xor ah,ah

mov al,i

mov bl,n

mul bl

add al,i

mov si,ax

mov al,mas2[si]

mul p

mov p,al

dec i

cmp i,1

jae cycle4

mov ah,9h

lea dx,message3

int 21h

mov bl,p ; заносим в bl значение определителя

cmp bl,0

jge Alge0p ; если p - отрицательное число

mov al,'-' ; выводим минус

int 29h

neg bl ; меняем знак

Alge0p:

mov al,bl

aam ; ah = al/10, al = остаток

add ax,'00' ; приводим числа в al и ah к виду, удобному для вывода

mov dx,ax ; копируем ax в dx

xchg dh,dl ; меняем местами dl и dh

cmp dl,'0' ; сравниваем dl с '0'

jne label1p ; если не равны, переход на label1

label1p:

mov ah,2 ; в ah - номер функции

int 21h ; вывод символа

xchg dh,dl ; меняем местами dl и dh

int 21h ; вывод символа

; перевод строки

mov ah,2 ; заносим в ah номер функции

mov dl,13 ; в dl - код возрата каретки

int 21h ; вывод символа

mov dl,10 ; в dl - код перевода строки

int 21h ; вывод символа

mov i,0

cycle1Change: ; цикл по строкам

mov j,0

cycle2Change: ; цикл по строке

xor ah,ah

mov al,i

mov bl,n

add al,j

mov si,ax

mov al,mas1[si] ; выделяем элемент матрицы

cmp al,p

jl LessOpr

mov bl,4

mul bl

mov bl,5

div bl ; если элемент больше определителя, уменьшить на 20%

jmp endCycle

LessOpr:

mov bl,13

mul bl

mov bl,10

div bl ; если элемент меньше определителя, увеличиваем на 30%

EndCycle:

mov mas1[si],al

inc j

mov al,n

cmp j,al

jb cycle2Change

inc i

mov al,n

cmp i,al

jb cycle1Change

mov ah,9h ; вывод сообщения

lea dx,message4

int 21h

call outMas ; вывод матрицы после изменения

mov ah,10h ; ожидание нажатия клавиши

int 16h

exit:

mov ax,4c00h ; выход

int 21h

outMas proc

prepare_for_show: ; подготовка к выводу массива

mov si,0 ; смещение обнуливается

mov di,0

mov cl,nn ; счетчик цикла - число элементов в массиве

xor ch,ch

show:

mov bl,mas1[si] ; заносим в bl очередной элемент

cmp bl,0

jge Alge0 ; если y - отрицательное число

mov al,'-' ; выводим минус

int 29h

neg bl ; меняем знак

Alge0:

mov al,bl

aam ; ah = al/10, al = остаток

add ax,'00' ; приводим числа в al и ah к виду, удобному для вывода

mov dx,ax ; копируем ax в dx

xchg dh,dl ; меняем местами dl и dh

cmp dl,'0' ; сравниваем dl с '0'

jne label1 ; если не равны, переход на label1

mov dl,20h ; иначе заносим в dl 20h (заменяем первый 0 на пробел)

label1:

mov ah,2 ; в ah - номер функции

int 21h ; вывод символа

xchg dh,dl ; меняем местами dl и dh

int 21h ; вывод символа

mov dl,20h ; в dl - код пробела

int 21h ; вывод двух пробелов

int 21h

; следующие строки предназначены для перевода строки и

; визуализации двумерного массива

mov ax,cx ; заносим в ax значение cx

sub ax,1 ; уменьшаем содержимое ax на 1

mov dl,n ; заносим в dl число n

div dl ; делим содержимое ax (номер элемента при выводе) на dl (7)

cmp ah,0 ; сверяем остаток с 0 (номер элемента кратен n)

jne nextIretation ; если нет, переходим к следующей итерации

mov ah,2 ; заносим в ah - номер функции

mov dl,13 ; в dl - код возрата каретки

int 21h ; вывод символа

mov dl,10 ; в dl - код перевода строки

int 21h ; вывод символа

nextIretation: ; подготовка к следующей итерации

inc si ; увеличение счетчика

loop show ; переход на следующую итерацию

ret

outMas endp

end main

Результат работы программы

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