Document 169771

advertisement
МИНИСТЕРСТВО ОБЩЕГО И ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ РФ
БРЯНСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
Кафедра: "Информатика и программное обеспечение"
Расчетное задание по дисциплине:
«Организация и функционирование ЭВМ»
“Управление часами реального времени
в формате внешних часов”
Выполнила:
студент группы 99-ПО1
Моргунова Е.А.
Проверил:
Конкин В.В.
Брянск 2000г.
Содержание
Введение
1. Постановка задачи
2. Описание программы
2.1.
Общие сведения
2.2.
Описание логической структуры
2.2.1. Алгоритм программы
2.2.2. Структура программы с описанием функций
составных частей и связи между ними
3. Инструкция пользователю
4. Список использованной литературы
Приложение А
2
Введение
Когда-то ассемблер был основным языком программирования, без
знания которого нельзя было заставить компьютер сделать что-либо
полезное. Постепенно ситуация менялась. Появились более удобные
средства общения с компьютером. Но в отличие от других языков ассемблер
не умирал, более того, он не мог сделать этого в принципе.
Располагая
языками
высокого
уровня, необходимость в языке
ассемблера, в силу его эффективности и четкости, не ослабевает и на
сегодняшний день. Не случайно практически все компиляторы языков
высокого уровня содержат средства связи своих модулей с модулями на
ассемблере
либо
поддерживают
выход
на
ассемблерный
уровень
программирования. В то же время, язык ассемблера требует планирования
буквально каждого шага ЭВМ. В случае небольших программ это позволяет
сделать их оптимальными с точки зрения эффективности использования
аппаратных средств.
Целью данного расчетного задания является повышение навыков
программирования на языке ассемблера. Как результат необходимо
предоставить программу, написанную на языке ассемблера.
Данное
расчетное
задание
состоит
в
написании
программы,
позволяющей определить реальное время.
Данная пояснительная записка состоит из четырех пунктов и
приложения.
В первом пункте освещается постановка задачи, цели и задачи, которые
преследовались при выполнении данного домашнего задания.
Второй пункт содержит описание программы: общие сведения и
описание логической структуры программы.
В третьем пункте приводится инструкция пользователю.
В приложении приводится текст программы.
3
Постановка задачи
ТЕМА:
Управление часами реального времени в формате внешних часов с
циферблатом. Установка будильника и разработка программ обработки
«звонка» будильника.
ЦЕЛЬ:
Ознакомится с основными положениями языка ассемблера, написание
программы.
ЗАДАЧИ:
1. Общие:
Программа должна иметь удобный интерфейс и быть проста в
обращении.
2. Программа должна:
2.1.
выполнять все требования, описанные в постановки задачи
2.2.
иметь выход из программы, выполняемый при соблюдении
последовательности
действий
пользователя.
4
описанных
в
руководстве
Описание программы
Общие сведения
Программа имеет название «Clock» и хранится на диске под именем clock.com,
занимает 1936 байт. Дата создания 27/12/2000. Для функционирования программы
необходимо выполнение следующих условий:
1. Операционная система MS_DOS 6.22 (Windows 95/98/2000).
2. IBM – совместимый персональный компьютер, наличие встроенного
динамика, .VGA – совместимый адаптер, наличие сопроцессора.
Описание логической структуры
Алгоритм программы
1. Вывод титульного листа
2. Ожидание нажатия клавиши. Очистка экрана
3. Вывод текущего времени в виде часов с циферблатом, оснащенным четырьмя
стрелками.
4. При совмещении стрелки будильника с часовой стрелкой последует звуковой
сигнал продолжительностью в две минуты.
5. Выход в ОС осуществляется при нажатии клавиши ESC.
5
Структура программы с описанием функций
составных частей и связи между ними
Программа состоит из файла с названием Clock.asm, который содержит
следующие основные процедуры:
1.
ClrScr
- очистка экрана
2.
OutStr
- вывод строки на экран
3.
OutChr
- вывод символа на экран
4.
OutDec
- вывод десятичного числа на экран
5.
PressAnyKey
6.
GoToCursor - Переход в нужную позицию экрана
7.
Titul - Вывод титульника
8.
OutCros - Затирает старые стрелки и отображает на новом
- ожидание нажатия любой клавиши
месте
9.
CurUgols - Устанавливает углы для стрелок в зависимости
от текущего времени
10.
GradToRad - Переводит радианы в градусы
11.
SinCos - Вычисляет синус и косинус
12.
Plot - Отображает точку на экране
13.
Line - Отображает линию по начальной точке, углу и
радиусу
14.
OutRim - Отображает римскую шестерку на циферблате
15.
OutFiga
- Выводит цифры на циферблате в указанной
позиции
16.
Number - Подготовка к выводу цифер на циферблате по
окружности
17.
Circul - Отображает окружность по центральной точке и
радиусу
18.
PlotFiga - Выводит точки на циферблате
19.
Time - Загружает текущие время в поля данных
20.
ClearKBuf - Очищает буфер клавиатуры
21.
ShowBUD - Стирает если ах<>0 или отображает ах=0
стрелку будильника
6
22.
BEEP - Подготовка к выводу звукового сигнала
23.
B10SPKR - Выводит звуковой сигнал
24.
CmpBeep - Проверяет на совпадение стрелок будильника и
часа
25.
CheckUgolBud - Проверяет угол стрелки будильника на
выход из облости (0:360)
7
Инструкция пользователю
Запуск программы
Для запуска программы необходимо запустить файл CLOCK.COM на
диске.
Порядок работы
После запуска программы на экране появится титульный лист с
описанием задания и другой информации по данной расчетной работе.
После нажатия любой клавиши на экране отобразится циферблат с
четырьмя стрелками: часовой, минутной, секундной и стрелкой будильника,
отличающимися между собой по длине и цвету.
Установка будильника осуществляется перемещением красной стрелки
циферблата
клавишами
управления
курсором
(правой/левой).
При
совмещении часовой стрелки и стрелки будильника последует звуковой
сигнал продолжительностью в две минуты. При нажатии клавиши ESC
произойдет выход из программы без завершения звукового сигнала.
8
Список использованной литературы
1.
В. Юров, С. Хорошенко, “Ассемблер. Учебный курс.”, С.-П. “Питер”,
1999г.
2.
Зубков, “Язык ассем блера для DOS, WINDOWS, UNIX”, М. “ДМК”,
2000г.
3.
П.В.Беспалов С.В. Горин С.М. Коновалов, «Программирование на
языке Ассемблер», М. “Высшая школа”, 1993г.
4.
П.Нортон , «Персональный компьютер фирмы IBM и операционная
система M-DOS», М. “Радио и связь”, 1991г.
5.
Питер Абель ,«Язык Ассемблера для IBM PC и программирования»,
М. “Высшая школа”, 1992г.
6.
П.Нортон , «Язык ассемблера для IBM PC», М. “Радио и связь”, 1990г.
9
ПРИЛОЖЕНИЕ А
mycode
segment
public para 'code'
assume cs:mycode,ds:mycode,ss:mycode,es:mycode
org
100h
.386
.387
START:
JMP GO
TX
dw
160
;Текущий X
TY
dw
100
;Текущий Y
;Текущий цвет
COLOR
dw
4
UGOL DD
00000000H
;Текущий угол
RAD DD
00000000H
;Текущий радиус
RESULT
DD
00000000H
;Временная переменная для хранения
;результатов работы с сопроцессором
RESULTX
dd
00000000h
;Результат для координаты x
RESULTY
dd
00000000h
;Результат для координаты y
COS
dd
00000000h
;Результат вычисления косинуса угла
SIN
dd
00000000h
;Результат вычисления синуса угла
STEPX
dd
(?)
;Шаг по X
STEPY
dd
(?)
;Шаг по Y
XC
dd
311
;Центр по X
YC
dd
230
;Центр по Y
UGOLCEK
dd
00000000h ;Угол секундной стрелки
UGOLMIN
dd
00000000h ;Угол минутной стрелки
UGOLCH
dd
UGOLBUD
CurCek
CurCH
CurMIN
00000000h ;Угол часовойой стрелки
dd
00000000h ;Угол стрелки будильника
db
0 ;Текушее количество секунд (RTC)
db
0 ;Текушее количество часов (RTC)
db
0 ;Текушее количество минут (RTC)
10
CurMCek
db
0 ;Текушее количество милисекунд (RTC)
RADCEK
dd
90 ;Радиус секундной стрелки
RADMIN
dd
70 ;Радиус минутной стрелки
RADCH
dd
RADBUD
60 ;Радиус часовой стрелки
dd
100 ;Радиус стрелки будильника
COLORCEK dw
15 ;Цвет секундной стрелки
COLORMIN dw
10 ;Цвет секундной стрелки
COLORCH
dw
COLORBUD dw
4
DURTION DW
TONE DW
050H
0FFFFH
10 ;Цвет секундной стрелки
;Цвет секундной стрелки
;Время звучания
;Высота (частота) звука
;Очистка экрана
ClrScr proc
mov ax,0600h
mov bh,07
mov cx,0000
mov dx,184Fh
int 10h
ret
ClrScr endp
;Вывод строки на экран
OutStr proc
mov ah,09
int 21h
ret
OutStr endp
11
OutChr
proc
push ax
mov ah,02h
int 21h
pop ax
ret
OutChr
endp
; Ожидание нажатия любой клавиши
PressAnyKey proc
push ax
mov
ah,0
int
16h
pop ax
ret
PressAnyKey endp
;Переход в нужную позицию экрана
GoToCursor proc
mov ah,02
mov bh,00
int 10h
ret
GoToCursor endp
;Вывод десятичного числа на экран из dx
OutDec
proc
mov
eax, edx
mov
ebx, 10
xor
cx, cx
12
_lp:
cdq
div
ebx
add
dx , 30h
push
dx
inc
cx
or
eax, eax
jnz
_lp
pop
dx
call
OutChr
loop
_l1
_l1:
ret
OutDec
endp
;Вывод титульника
Titul proc
call
ClrScr
;Очистка
экрана
mov
dh , 00
mov
dl , 22
call
gotocursor
lea
dx , Str1
call
OutStr ;Вывод строки на экран
mov
dh , 01
mov
dl , 13
call
gotocursor
lea
dx , Str2
call
OutStr
mov
dh , 03
mov
dl , 23
call
gotocursor
lea
dx , Str3
13
call
OutStr
mov
dh , 07
mov
dl , 19
call
gotocursor
lea
dx , Str4
call
OutStr
mov
dh , 08
mov
dl , 33
call
gotocursor
lea
dx , Str40
call
OutStr
mov
dh , 09
mov
dl , 18
call
gotocursor
lea
dx , Str5
call
OutStr
mov
dh , 10
mov
dl , 18
call
gotocursor
lea
dx , Str50
call
OutStr
mov
dh , 10
mov
dl , 45
call
gotocursor
lea
dx , Str6
call
OutStr
mov
dh , 11
mov
dl , 19
call
gotocursor
lea
dx , Str60
14
call
OutStr
mov
dh , 12
mov
dl , 19
call
gotocursor
lea
dx , Str61
call
OutStr
mov
dh , 16
mov
dl , 53
call
gotocursor
lea
dx , Str7
call
OutStr
mov
dh , 17
mov
dl , 65
call
gotocursor
lea
dx , Str8
call
OutStr
mov
dh , 18
mov
dl , 59
call
gotocursor
lea
dx , Str9
call
OutStr
mov
dh , 23
mov
dl , 33
call
gotocursor
lea
dx , Str10
call
OutStr
mov
dh , 24
mov
dl , 35
call
gotocursor
lea
dx , Str11
15
call
OutStr
call
PressAnyKey
ret
Str1 db 'Министерство образования РФ',24h
Str2 db 'Брянский Государственный технический университет',24h
Str3 db 'Кафедра информатики и ПО',24h
Str4 db 'Расчетное задание на языке ассемблер ',24h
Str40 db 'по теме:',24h
Str5 db '"Управление часами реального времени ',24h
Str50 db ' в формате внешних часов.',24h
Str6 db 'Установка ',24h
Str60 db ' будильника, разработка программ ',24h
Str61 db ' обработки "звонка" будильника."',24h
Str7 db 'Выполнила ст-ка гр.99ПО-1',24h
Str8 db 'Моргунова Е.А.',24h
Str9 db 'Проверил Конкин В.В.',24h
Str10 db 'г.Брянск ',24h
Str11 db '2000г.',24h
Titul endp
;Затирает старые стрелки и отображает на новом месте
OutCros
proc
pusha
mov
bx , offset COLOR
mov
eax , 0
mov
[bx] , eax
fild
UGOLCEK
fistp
UGOL
fild
RADCEK
fistp
RAD
call
Line
16
fild
UGOLMIN
fistp
UGOL
fild
RADMIN
fistp
RAD
call
Line
fild
UGOLCH
fistp
UGOL
fild
RADCH
fistp
RAD
call
Line
call CurUgols
xor
ax , ax
call
ShowBUD
fild
UGOLMIN
fistp
UGOL
fild
RADMIN
fistp
RAD
fild
COLORMIN
fistp
COLOR
call
Line
fild
UGOLCH
fistp
UGOL
fild
RADCH
fistp
RAD
fild
COLORCH
fistp
COLOR
call
Line
fild
UGOLCEK
fistp
UGOL
17
fild
RADCEK
fistp
RAD
fild
COLORCEK
fistp
COLOR
call
Line
call
CmpBeep
popa
ret
OutCros
endp
;Устанавливает углы для стрелок в зависимости от текущего времени
CurUgols
proc
pusha
mov
cl , CurCek[0]
mov
ax , 6
mul
cl
mov
bx , offset UGOLCEK
mov
[bx] , ax
xor
ax, ax
mov
al , CurCek
mov
dl , 10
div
dl
xor
dx , dx
mov
dl , al
mov
cl , CurMin[0]
mov
ax , 6
mul
cl
add
ax , dx
mov
bx , offset UGOLMIN
mov
[bx] , ax
mov
dl , 12
div
dl
18
xor
ah , ah
mov
dx , ax
mov
ch , CurCH[0]
cmp
ch , 13
jb
NEXTTIME
sub
ch , 12
NEXTTIME:
xor
eax, eax
mov
ax , 30
mul
ch
add
ax , dx
mov
bx , offset UGOLCH
mov
[bx] , ax
CURUGOLSEND:
popa
ret
CurUgols
endp
;Переводит радианы в градусы
GradToRad proc
pusha
fldpi
lea
bx , RESULT
mov
eax , 180
mov
[bx] , eax
fild
RESULT
fdiv
fild
UGOL
fmul
fstp
UGOL
popa
ret
GradToRad endp
19
;Вычисляет синус и косинус
SinCos proc
pusha
mov
eax , 90
lea
bx , RESULT
mov
[bx] , eax
fild
RESULT
fild
UGOL
fsubr
fistp
UGOL
call
GradToRad
fld
UGOL
fsincos
fstp
COS
fstp
SIN
popa
ret
SinCos endp
;Отображает точку на экране
Plot
proc
pusha
lea
bx , TY
mov
dx , [bx]
lea
bx , TX
mov
cx , [bx]
lea
bx , COLOR
mov
ax , [bx]
xor
bx , bx
mov
bh , 0
mov
ah , 0ch
int
10h
20
popa
ret
Plot
endp
;Отображает линию по начальной точке, углу и радиусу
Line
proc
pusha
call
SINCOS
mov
bx , offset RAD
mov
cx , [bx]
GO_LOOP:
mov
bx , offset RESULT
mov
[bx] , ecx
fild
RESULT
fmul
COS
fiadd XC
fistp
TX
mov
bx , offset RESULT
mov
[bx] , ecx
fild
RESULT
fmul
SIN
fiadd YC
fistp
TY
call
Plot
loop
GO_LOOP
popa
ret
Line
endp
; Отображает римскую шестерку на циферблате
21
OutRim proc
pusha
mov ax , TY
mov cl , 16
div
cl
mov dh , al
mov ax , TX
mov cl , 8
div
cl
mov dl , al
mov bh , 0
mov ah , 2h
int
10h
mov ah , 09h
mov bh , 0
mov al , 'V'
mov cx , 1
mov bl , 15
int
10h
mov ax , TY
mov cl , 16
div
cl
mov dh , al
mov ax , TX
mov cl , 8
div
cl
mov dl , al
inc
dl
22
mov bh , 0
mov ah , 2h
int
10h
mov ah , 09h
mov bh , 0
mov al , 'I'
mov cx , 1
mov bl , 15
int
10h
popa
ret
OutRim
endp
;Выводит цифры на циферблате в указанной позиции
OutFiga proc
pusha
pusha
mov ax , TY
mov cl , 16
div
cl
mov dh , al
mov ax , TX
mov cl , 8
div
cl
mov dl , al
mov bh , 0
mov ah , 2h
int
10h
popa
23
call
OutDec
popa
ret
OutFiga
endp
;Подготовка к выводу цифер на циферблате по окружности
Number
proc
pusha
mov
bx , offset RAD
mov
edx , [bx]
mov
ecx , 4
NumCur:
mov
edx , 130
mov
UGOL,90
mov
RESULT , ecx
fild
fild
UGOL
RESULT
fmul
fistp
UGOL
call
SINCOS
mov
RESULT , edx
fild
RESULT
fmul
COS
fiadd XC
fistp
TX
mov
RESULT , edx
fild
RESULT
fmul
SIN
24
fiadd YC
fistp
TY
cmp
ecx , 2
jnz
NUMNEXT
call
OutRim
JMP
NUMEND
NUMNEXT:
mov
eax , 3
mul
cl
mov
edx , eax
call
OutFiga
NUMEND:
loop NumCur
popa
ret
Number
endp
;Отображает окружность по центральной точке и радиусу
Circul proc
pusha
mov
bx , offset RAD
mov
edx , [bx]
mov
ecx , 360
mov
bx , offset UGOL
mov
[bx] , ecx
call
GradToRad
call
SINCOS
mov
bx , offset RESULT
mov
[bx] , edx
Cur:
;
25
fild
RESULT
fmul
COS
fiadd XC
fistp
TX
mov
bx , offset RESULT
mov
[bx] , edx
fild
RESULT
fmul
SIN
fiadd YC
fistp
TY
call
Plot
loop Cur
popa
ret
Circul endp
;Выводит точки на циферблате
PlotFiga proc
pusha
mov
COLOR , 15
mov
bx , offset RAD
mov
edx , [bx]
mov
ecx , 60
PlotCur:
mov
eax , 6
mul
cl
mov
bx , offset UGOL
mov
[bx] , eax
call
SINCOS
26
mov
bx , offset RESULT
mov
[bx] , edx
fild
RESULT
fmul
COS
fiadd XC
fistp
TX
mov
bx , offset RESULT
mov
[bx] , edx
fild
RESULT
fmul
SIN
fiadd YC
fistp
TY
call
Plot
loop PlotCur
popa
ret
PlotFiga endp
;Загружает текущие время в поля данных
Time proc
pusha
mov
ah , 2ch
int
21h
cmp
dh , CurCek[0]
je
TIMEEND
mov
CurCH[0] , ch
mov
CurMIN[0] , cl
mov
CurCek[0] , dh
27
TIMENEXT:
call
OutCros
TIMEEND:
popa
ret
Time endp
;Очищает буфер клавиатуры
ClearKBuf
proc
pusha
mov bx, 40h
mov es, bx
mov bx, es:[1ah]
mov es:[1ch], bx
popa
ret
ClearKBuf
endp
;Стирает ах=0 или отображает ах<>0 стрелку будильника
ShowBUD
proc
pusha
mov
COLOR[0] , 0
cmp
ax , 0
jnz
SHOWBUDNEXT
fild
COLORBUD
fistp
COLOR
SHOWBUDNEXT:
fild
UGOLBUD
fistp
UGOL
fild
RADBUD
28
fistp
RAD
call
Line
popa
ret
ShowBUD
endp
;Подготовка к выводу звукового сигнала
BEEP
PROC
NEAR
pusha
IN
AL,61H
PUSH
;Получить и сохранить
AX
; данные порта
CLI
;Запретить прерывания
CALL B10SPKR
POP
AX
OUT
61H,AL
STI
;Произвести звук
;Восстановить значение
; порта
;Разрешить прерывания
popa
RET
BEEP
ENDP
;Выводит звуковой сигнал
B10SPKR PROC
B20:
NEAR
MOV
DX,DURTION
;Установить время звучания
B30:
AND
AL,11111100B ;Очистить биты 0 и 1
OUT
61H,AL
MOV
CX,TONE
LOOP
B40
;Передать на динамик
;Установить частоту
B40:
OR
;Задержка времени
AL,00000010B ;Установить бит 1
29
OUT
61H,AL
;Передать на динамик
MOV
CX,TONE
LOOP
B50
;становить частоту
B50:
DEC
DX
JNZ
B30
SHR
TONE,2
JNZ
B20
RET
;Задержка времени
;Уменьшить время звучания
;Продолжать?
; сократить частоту
;Нулевая частота?
; да - выйти
B10SPKR ENDP
;Проверяет на совпадение стрелок будильника и часа
CmpBeep
proc
pusha
fild
UGOLCH
fild
UGOLBUD
fsub
fistp
RESULT
cmp
RESULT , 0
jl
CMPBEEPEND
cmp
RESULT , 1
jge
CMPBEEPEND
call
BEEP
CMPBEEPEND:
popa
ret
CmpBeep
endp
;Проверяет угол стрелки будильника на выход из облости (0:360)
CheckUgolBud
proc
pusha
30
mov
bx , offset UGOLBUD
mov
eax , [bx]
cmp
eax , 168H
jle
CHECKNEXT
sub
eax , 168H
CHECKNEXT:
cmp
eax , 0
jge
CHECKEND
add
eax , 168H
CHECKEND:
mov
[bx] , eax
popa
ret
CheckUgolBud
endp
GO:
Call
Titul ; Вывод титульника
;Сохраняем исходный видеорежим
mov
ah , 0fh
int
10h
push
ax
;Устанавливаем новый видеорежим: 640x480, 16 цветов
mov
ax ,4f02h
mov
bx , 12h
int
10h
;Отрисовка основной окружности
mov
eax , 145
lea
bx , RAD
mov
[bx] , eax
call
Circul
;Отрисовка циферблата
mov
eax , 130
31
lea
bx , RAD
mov
[bx] , eax
call
PlotFiga
call
Number
;Основной цикл
xor
cx , cx
MAINLOOP:
call
ClearKBuf
;Очистка буфера клавиатуры
call
Time
;Отрисовка текущего времени
;Считывание символа
in
al , 60h
inc
cx
cmp
cx ,10
jnb
MAINLOOPEND
xor
cx , cx
push
ax
cmp
al , 4dh ;проверяем на нажатие курсора в лево
jnz
MAINLOOPNEXT1 ;если нет то дальше
mov
ax , 1
call
ShowBUD
mov
bx , offset UGOLBUD
mov
eax , [bx]
inc
eax
mov
[bx] , eax
mov
ax , 0
call
ShowBUD
call
jmp
OutCros
;Стираем ах=1 стрелку будильника
;Увеличиваем угол стрелки будильника
;Отображаем стрелку будильника
;Получаем новое положение стрелки
MAINLOOPEND
MAINLOOPNEXT1:
cmp
al , 4bH
;проверяем нажатие на курсор в право
32
jnz
MAINLOOPNEXT2
mov
ax , 1
call
ShowBUD
mov
bx , offset UGOLBUD
mov
eax , [bx]
dec
eax
mov
[bx] , eax
mov
ax , 0
call
ShowBUD
call
jmp
OutCros
;если нет то дальше
;Отображаем стрелку будильника
;Уменьшаем угол стрелки будильника
;Отображаем стрелку будильника
;Получаем новое положение стрелки
MAINLOOPEND
MAINLOOPNEXT2:
MAINLOOPEND:
call
CheckUgolBud
pop
ax
cmp
jnz
;Проверем угол Стрелки Будильника
al , 1h
;проверяем нажатие ESC
MAINLOOP
;если нет то продолжаем цикл
;Востанавливаем исходный видеорежим
pop
ax
mov
ah , 00
int
10h
mov ah,4ch
;Выход в DOS
Int 21h
mycode
ends
end start
33
Download