Скачиваний:
85
Добавлен:
11.02.2014
Размер:
398.44 Кб
Скачать

Лабораторна робота №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

Висновки:Програма вирішує поставлене завдання. Теоретичні розрахунки відповідають отриманим. Програма працює правильно.

Соседние файлы в папке лабораторные работы по ASSAMBLER