Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
kursova_Klimyuk(1).doc
Скачиваний:
6
Добавлен:
13.09.2019
Размер:
314.37 Кб
Скачать

Розділ іі Практична частина

2.1 Алгоритм роботи програми

Вираз: y=(с*d+23)/(a/2-4*d-1).

А лгоритм роботи цієї програми:

Перевірка на введення числа і допустимого діапазону

Так

Ні

Перевірка на введення числа і допустимого діапазону

Перевірка на введення числа і допустимого діапазону

Так

Ні

Ні

Так

Обчислення знаменника

Так

Ні

Обчислення виразу

n або N

інший

Рис. 2.1 Алгоритм роботи програми

2.2 Програма обчислення значення виразу

;Програма призначена для обчислення значення виразу y=(c*d+23)/(a/2-4*d-1) (варіант 15) ; з вводом значень змінних і виводом результату для 8-бітних чисел

;Розробив студент 41-КСМ групи ТКЛНТУ Климюк М.М., 2011 р.

title programa

.model tiny ;модель пам'яті для СОМ-файла

.code

org 100h ;резервування пам'яті для PSP

start: jmp main ;обхід даних

;============ДАНІ============

a db ?

c db ?

d db ?

y dw ?

L dw 4 ;довжина буферу

e db ? ;прапорець помилки

vidp db 144,165,167,227,171,236,226,160,226,32,162,168,170,174,173,160,173,173,239,32,228,227,173,170,230,105,245,32,121,61,40,99,42,100,43,50,51,41,47,40,97,47,50,45,52,42,100,45,49,41,32,224,105,162,173,168,169,58,32,0dh,0ah,36

ye db 121,61,32,36

hello db 143,224,174,163,224,160,172,160,32,175,224,168,167,173,160,231,165,173,160,32,164,171,239,32,174,161,231,168,225,171,165,173,173,239,32,167,173,160,231,165,173,173,239,32,162,168,224,160,167,227,32,121,61,40,99,42,100,43,50,51,41,47,40,97,47,50,45,52,42,100,45,49,41,0dh,0ah,36

hello1 db 144,174,167,224,174,161,168,162,32,225,226,227,164,165,173,226,32,52,49,45,138,145,140,32,163,224,227,175,168,32,146,138,139,141,146,147,32,138,171,168,172,238,170,32,140,46,140,46,44,32,50,48,49,49,32,224,46,36

pause db 132,171,239,32,175,224,174,164,174,162,166,165,173,173,239,32,173,160,226,168,225,173,105,226,236,32,161,227,164,236,45,239,170,227,32,170,171,160,162,105,232,227,46,46,46,46,46,46,46,0dh,0ah,36

repeat db 130,168,170,174,173,160,226,168,32,175,224,174,163,224,160,172,227,32,233,165,32,224,160,167,63,32,40,34,78,34,32,45,32,162,168,229,105,164,41,58,36

goodbye db 'Good bye my friend',0dh,0ah,'$'

outbuf db 4 dup(?),'$' ;буфер виводу

inbuf db 6,7 dup (' ') ;буфер вводу

cr_lf db 0dh,0ah,'$' ;перехід на новий рядок

err1 db 130,162,165,164,165,173,174,32,167,160,161,160,163,160,226,174,32,225,168,172,162,174,171,105,162,33,0dh,0ah,36

err2 db 130,162,165,164,165,173,174,32,173,165,32,230,168,228,224,227,33,0dh,0ah,36

err3 db 143,174,224,227,232,165,173,168,169,32,164,105,160,175,160,167,174,173,33,0dh,0ah,36

err4 db 132,105,171,165,173,173,239,32,173,160,32,48,33,0dh,0ah,36

in_a db 130,162,165,164,105,226,236,32,167,172,105,173,173,227,32,97,32,91,45,49,50,55,46,46,49,50,54,93,58,32,36

in_c db 130,162,165,164,105,226,236,32,167,172,105,173,173,227,32,99,32,91,45,49,50,55,46,46,49,50,54,93,58,32,36

in_d db 130,162,165,164,105,226,236,32,167,172,105,173,173,227,32,100,32,91,45,49,50,55,46,46,49,50,54,93,58,32,36

;============ПОЧАТОК ПРОГРАМНОГО КОДУ============

;------------------------------------------------------------

;-----головна процедура

main proc near

lea dx,hello

call output ;вивід рядка hello

lea dx,hello1

call output ;вивід рядка hello1

again:

lea dx,cr_lf

call output

mov e,0

lea dx,pause

call output

call readkey ;очікування натиснення клавіші

;-----введення змінних

lea dx,in_a

call output ;виведення підказки

call readstring ;введення змінної а

cmp e,0

jg erro

mov a,al ;запам'ятовування змінної а

lea dx,cr_lf

call output

;-----

lea dx,in_c

call output ;виведення підказки

call readstring ;введення змінної c

cmp e,0

jg erro

mov c,al ;запам'ятовування змінної c

lea dx,cr_lf

call output

;-----

lea dx,in_d

call output ;виведення підказки

call readstring ;введення змінної d

cmp e,0

jg erro

mov d,al ;запам'ятовування змінної d

lea dx,cr_lf

call output

;-----

call matem ;виклик обчислювальної процедури

cmp e,0

jg erro

lea bx,outbuf ;адреса буферу виводу==>BX

call bin_ascii ;перехід до підпрограми перетворення двійкового коду

;числа у символьний код ASCII

lea dx,vidp

call output ;вивід рядка vidp

lea dx,ye

call output

lea dx,[bx]

call output ;вивід відповіді

erro:

lea dx,cr_lf

call output

call output

lea dx,repeat

call output

mov ah,1

int 21h

cmp al,'n'

je bye

cmp al,'N'

je bye

jmp again

bye:

lea dx,cr_lf

call output

lea dx,goodbye

call output

call readkey

ret

main endp

;------------------------------------------------------------

;-----процедура обчислення значення функції

matem proc near

;-----обчислення знаменника

mov al,4 ;<AL>=4

mov dl,d ;<DL>=d

imul dl ;<AX>=4*d

mov cx,ax ;<CX>=<AX>=4*d

mov al,a ;<AL>=a

cbw ;розширення розрядності числа d

mov bl,2 ;<BL>=2

idiv bl ;<AL>=a/2

cbw ;AL==>AX

neg cx

add cx,ax ;<CX>=a/2-4*d

dec cx ;<CX>=знаменник

jcxz error

;-----обчислення чисельника

mov al,c ;<AL>=c

imul dl ;<AX>=c*d

add ax,23 ;<AX>=чисельник

cwd ;AX==>DX:AX

;-----результат

idiv cx ;<AX>=(c*d+23)/(a/2-4*d-1)

mov y,ax ;зберегти результат в y

jmp exit

;-----помилка ділення на 0

error: lea dx,err4

call output

mov e,4

exit: ret

matem endp

;------------------------------------------------------------

;-----процедура виводу на екран рядка символів

output proc near

push ax

mov ah,9

int 21h

pop ax

ret

output endp

;------------------------------------------------------------

;-----процедура перетворення числа в рядок символів в ASCII коді

bin_ascii proc near

push dx si ax

mov cx,l

;-----очистка буферу виводу і встановлення BX на кінець буферу

fill_buf:

mov byte ptr [bx],' '

inc bx

loop fill_buf

;-----перетворення числа

mov si,10

or ax,ax ;перевірка знаку

jns clr_dvd ;обхід, число додатнє

neg ax ;міняємо знак, від'ємне число

clr_dvd:

xor dx,dx

div si ;<DX:AX>=<DX:AX>/10

add dx,'0' ;остачу==>ASCII

dec bx

mov byte ptr [bx],dl;символ==>буфер

inc cx ;кількість символів

or ax,ax ;частка = 0?

jnz clr_dvd ;ні - продовжуємо обчислення

pop ax ;вигружаємо зі стеку вихідне число

or ax,ax ;число від'ємне?

jns nomore ;ні - обхід

dec bx

mov byte ptr [bx],'-' ;добавляємо знак '-'

inc cx

nomore:

pop si dx

ret

bin_ascii endp

;------------------------------------------------------------

;-----процедура очікування введення символу

readkey proc near

push ax ;збереження <АХ>

mov ah,8 ;читання символу

int 21h

pop ax ;відновлення <AX>

ret

readkey endp

;------------------------------------------------------------

;-----процедура вводу рядка символів в буфер клавіатури

readstring proc near

push ax

lea dx,inbuf

mov ah,0ch ;очистка буфера

mov al,0ah ;читання строки в буфер

int 21h

xor ch,ch

mov cl,inbuf+1 ;реальна кількість введених символів

add dx,2 ;встановлення показника на інф. частину буфера

pop ax

mov bx,dx

call ascii_bin

ret

readstring endp

;------------------------------------------------------------;-----процедура перетворення рядка символів в число

ascii_bin proc near

push bx

push cx

xor ax,ax

mov di,0ffh ;немає помилок

cmp cx,l

ja bad ;CX>L

blanks: ;пропуск вудучих пробілів

cmp byte ptr [bx],' '

jne chkneg ;немає пробілів

inc bx

loop blanks

chkneg: ;число від'ємне?

pop cx

push cx

cmp byte ptr [bx],'-'

jne chkpos ;ні

inc bx ;наступний символ

dec cx

;-----перетворення від'ємного числа

call conv_st

jc quit ;є помилки при претворенні строки

cmp ax,128 ;перевірка допустимого діапазону

ja badrange ;AX>128

neg al ;міняємо знак

clc ;CF=0 (немає помилок)

js good

chkpos: ;-----перетворення додатного числа

cmp byte ptr [bx],'+' ;є знак '+'?

jne go_conv ;ні

inc bx ;пропуск знака '+'

dec cx

go_conv:

call conv_st

jc quit ;є помилки при претворенні строки

cmp ax,127 ;перевірка допустимого діапазону

ja badrange

good:

clc ;CF=0

jnc quit

;-----помилки

bad: ;CX>L

lea dx,cr_lf

call output

lea dx,err1

call output

mov e,1

stc ;СF=1

jmp quit

badrange: ;вихід за діапазон

lea dx,err3

call output

mov e,3

stc ;СF=1

quit:

pop cx

pop bx

ret

ascii_bin endp

;------------------------------------------------------------

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

conv_st proc near

push bp bx si

mov bp,bx

xor bx,bx

mov si,10

range: ;перевірка на допустимий символ

cmp byte ptr ds:[bp],'0'

jb nonedigit ; < '0'

cmp byte ptr ds:[bp],'9'

jbe digit ; < '9'

nonedigit: ;не цифра

lea dx,cr_lf

call output

lea dx,err2

call output

mov e,2

mov di,bp ;адреса помилкового символа ==> DI

stc ;CF=1

jc end_conv

digit: ;обробка цифри

push dx

mul si ;<DX:AX>=AX*10

pop dx

mov bl,ds:[bp] ;ASCII код

and bx,0fh ;виділення молодшої частини

add al,bl

inc bp

loop range

clc ;CF=0

end_conv:

pop si

pop bx

pop bp

ret

conv_st endp

;------------------------------------------------------------

end start

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