
Лабораторна робота №3
Тема:програмування розгалуженних алгоритмів..
Завдання:
1. Написати програму, яка буде обчислювати значення функції.
Z=
(x+y)/ xy якщо x > 0; y > 0
25y якщо x = 0
6x якщо у = 0
1 в інших випадках
Текст програми:
; LAB_3
assume CS:code, DS:data
code segment
begin:
mov AX, data
mov DS, AX
call Display_Ask_X
call Input ; ввод X (ограничено 2-мя символами)
mov BX, AX ; Х будем хранить в ВХ
call Display_Ask_Y
call Input ; ввод Y (ограничено 2-мя символами)
mov CX, AX ; Y будем хранить в СХ
call Display_ok
call Analyse ; наша процедурка
call Output ; вывод целого числа с АХ - иам наш результат
; ждем нажатия любой клавиши
mov AH, 10h
int 16h
; завершение программы
mov AX, 4C00h
int 21h
;----------------------------------------------------------------------------------------------------------
Analyse proc ; анализируем, что там навводили х в ВХ, у в СХ
cmp BX, 0 ; проверяем условие х>0 & y>0
jng lbl_b
cmp CX, 0
jg lbl_1
lbl_b:
cmp BX, 0 ; проверяем условие х=0 & y!=0
jne lbl_c
cmp CX, 0
jne lbl_2
lbl_c:
cmp BX, 0 ; проверяем условие х!=0 & y=0
je lbl_4
cmp CX, 0
je lbl_3
lbl_4: ; =1
mov AX, 1
jmp exit_a
lbl_3: ; =6х
mov AX, 6
imul BX
jmp exit_a
lbl_2: ; =25у
mov AX, 25
imul CX
jmp exit_a
lbl_1: ; по формуле
mov AX, BX ; ложим Х в АХ
imul CX ; умножаем его на Y
mov DI, AX ; результат кладем на склад
mov AX, BX ; ложим X в АХ
add AX, CX ; складываем его с Y
idiv DI ; делим
exit_a:
ret
Analyse endp
;----------------------------------------------------------------------------------------------------------
Input proc
push BX
mov DX, offset Buff ; вводим наше число
mov AH, 10
int 21h
mov SI, offset Buff+1 ; адрес где лежит кол-во введенных цифр
xor CX, CX
mov CL, [SI] ; берем кол-во введенных цифр для цикла
cmp CX, 0 ; если ноль - на выход
je exit_lbl
mov fl, 0 ; по умолчанию сбрасываем флаг негативного числа
inc SI ; берем первый разряд нашего числа
mov AL, [SI] ; пхаем его в регстр для обработки
cmp AL,'-' ; если минус - установить флаг
jne positiv
mov fl, 1 ; флаг негативного числа
dec CL ; кло-во цифр стало на 1 меньше
cmp CX, 0 ; если кроме минуса там ничего нет - на выход
je exit_lbl
inc SI ; следующий разряд нашего числа
positiv:
xor AX, AX
xor DI, DI
mov DI, 10 ; 10 - кратность
dec SI ; адрес цифры возвращаем обратно
lbl1:
inc SI ; берем следующий разряд нашего числа
xor BX, BX
mov BL, [SI] ; пхаем его в регстр для обработки
sub BL, '0' ; обрабатываем его - перобразуем в людской вид
cmp BL, 9 ; если это не цифра - на выход
ja exit_lbl
mul DI ; умножаем его на 10
add AX, BX ; складываем до купы
loop lbl1
cmp fl,1 ; если у нас отрицательное число
jne ee
neg AX ; цепляем ему минус
ee:
pop BX
ret
exit_lbl:
call Error_Exit
Input endp
;----------------------------------------------------------------------------------------------------------
Output proc
mov BX, 10 ; основа системы счисления
mov DI, offset Buff+6 ; счетчик на конец буффера
mov fl, 0 ; по умолчанию сбрасываем флаг негативного числа
cmp AX, 0 ; наше число отрицаиельное?
jge Pr1
neg AX ; если да, то делаем его положительным
mov fl, 1 ; но устанавливаем флаг отриц. числа
Pr1: xor DX, DX ; тут будет остаток
div BX ; делим АХ на 10 - остаток в DX
mov SI, offset Tabl ; адес начала таблицы с символами
add SI, DX ; адрес нужного нам символа
mov DL, [SI] ; пхаем его в память, там где Buff
mov [DI], DL
dec DI ; переходим на следующее место
cmp AX, 0 ; а не закончилось ли у нас число?
jnz Pr1 ; если нет то опять за свое
cmp fl,1 ; если у нас отрицательное число
jne eee
mov DL, '-'
mov [DI], DL ; цепляем ему минус
dec DI ; переходим на следующее место
eee:
mov AH, 9 ; если да, то гуляем (выводим число на экран)
mov DX, DI ; это у нас место, где начинается символы числа
inc DX ; на самом деле чуть правее
int 21h
ret
Output endp
;----------------------------------------------------------------------------------------------------------
Display_ok proc ; сообщаем, что все хорошо
push AX
mov DX, offset text1
mov AH, 9
int 21h
pop AX
ret
Display_ok endp
;----------------------------------------------------------------------------------------------------------
Error_Exit proc ; сообщаем, что все пропало и выходим
mov DX, offset text2
mov AH, 9
int 21h
; ждем нажатия любой клавиши
mov AH, 10h
int 16h
; завершение программы
mov AX, 4C00h
int 21h
ret
Error_Exit endp
;----------------------------------------------------------------------------------------------------------
Display_Ask_X proc ; спрашиваем ввести Х
mov DX, offset text3
mov AH, 9
int 21h
ret
Display_Ask_X endp
;----------------------------------------------------------------------------------------------------------
Display_Ask_Y proc ; спрашиваем ввести Y
mov DX, offset text4
mov AH, 9
int 21h
ret
Display_Ask_Y endp
;----------------------------------------------------------------------------------------------------------
code ends
data segment
Buff db 3, 6 dup(0), '$'
fl db 0
Tabl db '0123456789'
text1 db 13, 10, 'All ok', 13, 10, '$'
text2 db 13, 10, 'Error Exit', 13, 10, '$'
text3 db 13, 10, 'Enter X', 13, 10, '$'
text4 db 13, 10, 'Enter Y', 13, 10, '$'
text5 db 13, 10, 'Z =', 13, 10, '$'
data ends
end
stak segment stack
db 256 dup(?)
stak ends
end begin
Отримані результати:
Enter X 1
Enter Y 1
2
Enter X 0
Enter Y 20
250
Enter X 50
Enter Y 0
300
Enter X -1
Enter Y -9
1
Блок-схема до програми:
Висновки:Програма вирішує поставлене завдання. Теоретичні розрахунки відповідають отриманим. Програма працює правильно.
Лабораторна робота №4
Тема:масиви.
Завдання:
1. Написати програму додавання елементів масиву.
Текст програми:
; LAB_4
assume CS:code, DS:data
code segment
begin:
mov AX, data
mov DS, AX
mov DX, offset text3 ; спрашиваем сколько элементов будет
mov AH, 9
int 21h
call Input ; ввод числа элементов
cmp AL, 100 ; если больше 100 - на выход
ja exit_lbl2
cmp AL, 1 ; если меньше 1 - на выход
jl exit_lbl2
mov QE, AX ; ложим в память
mov CX, AX ; ложим в СХ для loop
lea DI, arr ; адрес первого элемента массива
loop_lbl:
mov DX, offset text4 ; спрашиваем значение элемента
mov AH, 9
int 21h
call Input ; ввод элемента (ограничено 3-мя символами)
mov arr[DI], AX ; ложим его в нужную ячейку
add DI, 2
loop loop_lbl
call Display_ok
mov DX, offset text5 ; сумма
mov AH, 9
int 21h
call Arr_sum ; суммируем все наше добро
call Output ; вывод целого числа с АХ - там наш результат
exit_lbl2:
; ждем нажатия любой клавиши
mov AH, 10h
int 16h
; завершение программы
mov AX, 4C00h
int 21h
;----------------------------------------------------------------------------------------------------------
Arr_sum proc
mov CX, QE ; размер нашего массива
xor AX, AX ; тут складываем сумму
lea DI, arr ; адрес первого элемента массива
as_lbl:
mov BX, arr[DI]
add AX, BX
add DI, 2
loop as_lbl
ret
Arr_sum endp
;----------------------------------------------------------------------------------------------------------
Input proc
push CX
push DI
mov DX, offset Buff ; вводим наше число
mov AH, 10
int 21h
mov SI, offset Buff+1 ; адрес где лежит кол-во введенных цифр
xor CX, CX
mov CL, [SI] ; берем кол-во введенных цифр для цикла
cmp CX, 0 ; если ноль - на выход
je exit_lbl
mov fl, 0 ; по умолчанию сбрасываем флаг негативного числа
inc SI ; берем первый разряд нашего числа
mov AL, [SI] ; пхаем его в регстр для обработки
cmp AL,'-' ; если минус - установить флаг
jne positiv
mov fl, 1 ; флаг негативного числа
dec CL ; кло-во цифр стало на 1 меньше
cmp CX, 0 ; если кроме минуса там ничего нет - на выход
je exit_lbl
inc SI ; следующий разряд нашего числа
positiv:
xor AX, AX
xor DI, DI
mov DI, 10 ; 10 - кратность
dec SI ; адрес цифры возвращаем обратно
lbl1:
inc SI ; берем следующий разряд нашего числа
xor BX, BX
mov BL, [SI] ; пхаем его в регстр для обработки
sub BL, '0' ; обрабатываем его - перобразуем в людской вид
cmp BL, 9 ; если это не цифра - на выход
ja exit_lbl
mul DI ; умножаем его на 10
add AX, BX ; складываем до купы
loop lbl1
cmp fl,1 ; если у нас отрицательное число
jne ee
neg AX ; цепляем ему минус
ee:
pop DI
pop CX
ret
exit_lbl:
call Error_Exit
Input endp
;----------------------------------------------------------------------------------------------------------
Output proc
mov BX, 10 ; основа системы счисления
mov DI, offset Buff+6 ; счетчик на конец буффера
mov fl, 0 ; по умолчанию сбрасываем флаг негативного числа
cmp AX, 0 ; наше число отрицаиельное?
jge Pr1
neg AX ; если да, то делаем его положительным
mov fl, 1 ; но устанавливаем флаг отриц. числа
Pr1: xor DX, DX ; тут будет остаток
div BX ; делим АХ на 10 - остаток в DX
mov SI, offset Tabl ; адес начала таблицы с символами
add SI, DX ; адрес нужного нам символа
mov DL, [SI] ; пхаем его в память, там где Buff
mov [DI], DL
dec DI ; переходим на следующее место
cmp AX, 0 ; а не закончилось ли у нас число?
jnz Pr1 ; если нет то опять за свое
cmp fl,1 ; если у нас отрицательное число
jne eee
mov DL, '-'
mov [DI], DL ; цепляем ему минус
dec DI ; переходим на следующее место
eee:
mov AH, 9 ; если да, то гуляем (выводим число на экран)
mov DX, DI ; это у нас место, где начинается символы числа
inc DX ; на самом деле чуть правее
int 21h
ret
Output endp
;----------------------------------------------------------------------------------------------------------
Display_ok proc ; сообщаем, что все хорошо
push AX
mov DX, offset text1
mov AH, 9
int 21h
pop AX
ret
Display_ok endp
;----------------------------------------------------------------------------------------------------------
Error_Exit proc ; сообщаем, что все пропало и выходим
mov DX, offset text2
mov AH, 9
int 21h
; ждем нажатия любой клавиши
mov AH, 10h
int 16h
; завершение программы
mov AX, 4C00h
int 21h
ret
Error_Exit endp
;----------------------------------------------------------------------------------------------------------
code ends
data segment
Buff db 4, 6 dup(0), '$'
fl db 0
Tabl db '0123456789'
QE dw 0
text1 db 13, 10, 'All ok', 13, 10, '$'
text2 db 13, 10, 'Error Exit', 13, 10, '$'
text3 db 13, 10, 'Enter elements quantity up to 100', 13, 10, '$'
text4 db 13, 10, 'Enter element ', '$'
text5 db 13, 10, 'Elements sum = ', '$'
arr dw 100 dup (0)
data ends
end
stak segment stack
db 256 dup(?)
stak ends
end begin
Блок-схема до програми:
Отримані результати:
Enter elements quantity up to 100 5
Enter element 1
Enter element 20
Enter element 300
Enter element 400
Enter element -50
Elements sum = 671
Висновки:Програма вирішує поставлене завдання. Теоретичні розрахунки відповідають отриманим. Програма працює правильно.