- •Розділ і Теоретична частина
- •1.1 Керуючі регістри процесора Структура керуючих регістрів процесора
- •Структура регістру прапорців процесора
- •1 .2 Перемикання між режимами
- •1.3 Формування фізичної адреси
- •Формування лінійної адреси без участі селекторів.
- •Формування лінійної адреси в захищеному режимі
- •Сторінкове перетворення адрес
- •1.4 Захист по привілеях
- •Захист на рівні сегментів
- •Захист на рівні сторінок
- •1.5 Мультизадачність
- •1 .6 Особливості режиму системного управління
- •Порівняльні характеристики режимів процесора
- •Розділ іі Практична частина
- •2.1 Алгоритм роботи програми
- •2.2 Програма обчислення значення виразу
- •Висновки
- •Список використаної літератури
Розділ іі Практична частина
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