- •Контрольная работа
- •Тема №1 «Арифметические и логические команды в ассемблере».
- •Тема №3 « Работа с массивами и стеком на языке ассемблера»
- •Тема №4 «Работа с математическим сопроцессором в среде Assembler»
- •Тема №5 «Программирование на языке ассемблера задач с использованием системных ресурсов bios. Работа в графическом режиме»
- •Тема №6 «Работа с файлами в языке Assembler»
Тема №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
Результат работы программы
