Курсовая работа «Часы реального времени» «Организация ЭВМ»

advertisement
ФЕДЕРАЛЬНОЕ АГЕНСТВО ПО НАУКЕ И ОБРАЗОВАНИЮ
РОССИЙСКОЙ ФЕДЕРАЦИИ
БРЯНСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
Курсовая работа
по дисциплине
«Организация ЭВМ»
на тему
«Часы реального времени»
Выполнила: студентка гр. 06-ПО4
Жукова Н.И.
Проверил: Статутов А.Г.
Брянск 2007г.
Содержание
Введение________________________________________ 3
Теоретическая часть ________________________________ 5
Часы реального времени и CMOS-память __________ 5
Средства BIOS _________________________________ 10
Системный таймер _____________________________ 11
Постановка задачи _________________________________ 15
Описание программы ________________________________ 15
Общие сведения ________________________________ 15
Описание логической структуры _________________ 15
Алгоритм программы ___________________________ 15
Структура программы с описанием основных процедур __ 16
Инструкция пользователю __________________________ 17
Запуск программы ______________________________ 17
Порядок работы ________________________________ 17
Заключение _________________________________________ 18
Приложение ________________________________________ 19
Литература ________________________________________ 32
2
Введение
Когда-то ассемблер был основным языком программирования, без
знания которого нельзя было заставить компьютер сделать что-либо
полезное. Постепенно ситуация менялась. Появились более удобные
средства общения с компьютером. Но в отличие от других языков ассемблер
не умирал, более того, он не мог сделать этого в принципе.
Располагая языками высокого уровня, необходимость в языке
ассемблера, в силу его эффективности и четкости, не ослабевает и на
сегодняшний день. Не случайно практически все компиляторы языков
высокого уровня содержат средства связи своих модулей с модулями на
ассемблере
либо
поддерживают
выход
на
ассемблерный
уровень
программирования. В то же время, язык ассемблера требует планирования
буквально каждого шага ЭВМ. В случае небольших программ это позволяет
сделать их оптимальными с точки зрения эффективности использования
аппаратных средств.
Программы на языке ассемблера очень точны. Поскольку этот язык
позволяет программисту непосредственно
работать со всем аппаратным
обеспечением, ассемблерная программа может делать то, что недоступно
никакой другой программе.
устройств
ввода-вывода,
где
Несомненно, что в
требуется
программировании
контроль над
отдельными
разрядами регистров устройства, программирование на языке ассемблера единственный подходящий выбор. Ясно, что эффективность и точность
языка ассемблера дают определенные преимущества.
Программисты фирмы IBM писали
с использованием процедур
ассемблера все программы управления устройствами ввода-вывода для IBM
PC. Для управления
устройствами
ввода-вывода
и
системой
прерываний, потребовалась та точность языка ассемблера, которую не
может обеспечить ни один другой язык программирования.
3
Язык ассемблера необходим также и в тех случаях, когда главными
являются рабочие
характеристики программы. Это может быть время
исполнения или конечный размер программы.
Каким бы умным ни был программист, каким бы хорошим ни был
язык, на котором он написал свою чудную программу, без знания
ассемблера ему не обойтись. И не случайно практически все компиляторы
языков высокого уровня содержат средства связи своих модулей с модулями
на ассемблере либо поддерживают выход на ассемблерный уровень
программирования.
4
Теоретическая часть
Часы реального времени и CMOS-память
В каждом компьютере есть микросхема, отвечающая за поддержку
текущей даты и времени. Для того чтобы они не сбрасывались при каждом
выключении питания, на микросхеме расположена небольшая область
памяти (от 64 до 128 байт), выполненная по технологии CMOS,
позволяющей снизить энергопотребление до минимума (фактически энергия
в таких схемах затрачивается только на зарядку паразитных емкостей при
изменении состояния ячеек памяти). Вся эта микросхема получает питание
от аккумулятора, расположенного на материнской плате, и не отключается
при выключении компьютера. Для хранения собственно времени достаточно
всего четырнадцати байт такой энергонезависимой памяти, и остальная ее
часть
используется
BIOS
для
хранения
различной
информации,
необходимой для корректного запуска компьютера. Для общения с CMOS и
регистрами RTC выделяются порты ввода-вывода от 70h до 7Fh, но только
назначение портов 70h и 71h одинаково для всех материнских плат:
порт 70h для записи: индекс для выбора регистра CMOS:
бит 7: прерывание NMI запрещено на время чтения/записи
бит 6: собственно индекс
порт 71h для чтения и записи: данные CMOS
После записи в порт 70h обязательно надо выполнить запись или
чтение из порта 71h, иначе RTC окажется в неопределенном состоянии.
Содержимое регистров CMOS варьируется для разных BIOS, но первые 33h
регистра обычно выполняют следующие функции:
00h: RTC — текущая секунда (00 – 59h или 00 – 3Bh) — формат
выбирается регистром 0Bh, по умолчанию — BCD
5
01h: RTC — секунды будильника (00 – 59h или 00 – 3Bh или FFh
(любая секунда))
02h: RTC — текущая минута (00 – 59h или 00 – 3Bh)
03h: RTC — минуты будильника (00 – 59h или 00 – 3Bh или FFh)
04h: RTC — текущий час:
0 – 23h/00 – 17h (24-часовой режим)
1 – 12h/01 – 1Ch (12-часовой режим до полудня)
81h – 92h/81 – 8Ch (12-часовой режим после полудня)
05h: RTC — часы будильника (то же или FFh, если любой час)
06h: RTC — текущий день недели (1 – 7, 1 — воскресенье)
07h: RTC — текущий день месяца (01 – 31h/01h – 1Fh)
08h: RTC — текущий месяц (01 – 12h/01 – 0Ch)
09h: RTC — текущий год (00 – 99h/00 – 63h)
0Ah: RTC — регистр состояния А
бит 7: 1 — часы заняты (происходит обновление)
биты 4 – 6: делитель фазы (010 — 32 768 KHz — по умолчанию)
биты 3 – 0: выбор частоты периодического прерывания:
0000 — выключено
0011 — 122 микросекунды (минимум)
1111 — 500 миллисекунд
0110 — 976,562 микросекунды (1024 Hz)
6
0Bh: RTC — регистр состояния В
бит 7: запрещено обновление часов (устанавливают перед записью
новых значений в регистры даты и часов)
бит 6: вызов периодического прерывания (IRQ8)
бит 5: вызов прерывания при срабатывании будильника
бит 4: вызов прерывания по окончании обновления времени
бит 3: включена генерация прямоугольных импульсов
бит 2: 1/0 — формат даты и времени двоичный/BCD
бит 1: 1/0 — 24-часовой/12-часовой режим
бит 0: автоматический переход на летнее время в апреле и октябре
0Ch только для чтения: RTC — регистр состояния С
бит 7: произошло прерывание
бит 6: разрешено периодическое прерывание
бит 5: разрешено прерывание от будильника
бит 4: разрешено прерывание по окончании обновления часов
0Dh только для чтения: регистр состояния D
бит 7: питание RTC/CMOS есть
0Eh: результат работы POST при последнем старте компьютера:
бит 7: RTC сбросились из-за отсутствия питания CMOS
бит 6: неверная контрольная сумма CMOS-конфигурации
бит 5: неверная конфигурация
7
бит 4: размер памяти не совпадает с записанным в конфигурации
бит 3: ошибка инициализации первого жесткого диска
бит 2: RTC-время установлено неверно (например, 30 февраля)
0Fh: состояние, в котором находился компьютер перед последней
перезагрузкой
00h — Ctr-Alt-Del
05h — INT 19h
0Ah, 0Bh, 0Ch — jmp, iret, retf на адрес, хранящийся в 0040h:0067h
Другие значения указывают, что перезагрузка произошла в ходе
POST или в других необычных условиях
10h: тип дисководов (биты 7 – 4 и 3 – 0 — типы первого и второго
дисковода)
0000: отсутствует
0001: 360 Кб
0010: 1,2 Мб
0011: 720 Кб
0100: 1,44 Мб
0101: 2,88 Мб
12h: тип жестких дисков (биты 7 – 4 и 3 – 0 — типы первого и второго
жестких дисков, 1111, если номер типа больше 15)
14h: байт состояния оборудования
биты 7 – 6: число установленных жестких дисков минус один
8
биты 5 – 4: тип монитора (00, 01, 10, 11 — EGA/VGA, 40x25 CGA,
80x25 CGA, MDA)
бит 3: монитор присутствует
бит 2: клавиатура присутствует
бит 1: FPU присутствует
бит 0: дисковод присутствует
15h: младший байт размера базовой памяти в килобайтах (80h)
16h: старший байт размера базовой памяти в килобайтах (02h)
17h: младший байт размера дополнительной памяти (выше 1 Мб) в
килобайтах
18h: старший байт размера дополнительной памяти (выше 1 Мб) в
килобайтах
19h: тип первого жесткого диска, если больше 15
lAh: тип второго жесткого диска, если больше 15
2Eh: старший байт контрольной суммы регистров 10h – 2Dh
2Fh: младший байт контрольной суммы регистров 10h – 2Dh
30h: младший байт найденной при POST дополнительной памяти в
килобайтах
31h: старший байт найденной при POST дополнительной памяти в
килобайтах
32h: первые две цифры года в BCD-формате;
9
Средства BIOS
Функции DOS вывода на экран позволяют перенаправлять вывод в
файл, но не позволяют вывести текст в любую позицию экрана и не
позволяют изменить цвет текста. DOS предполагает, что для более тонкой
работы с экраном программы должны использоваться видеофункции BIOS.
BIOS
(базовая
система
ввода-вывода) —
это
набор
программ,
расположенных в постоянной памяти компьютера, которые выполняют его
загрузку сразу после включения и обеспечивают доступ к некоторым
устройствам, в частности к видеоадаптеру. Все функции видеосервиса BIOS
вызываются через прерывание 10h. Рассмотрим функции, которые могут
быть полезны для вывода текстов на экран (полностью видеофункции BIOS
описаны в приложении 2).
Выбор видеорежима
BIOS предоставляет возможность переключения экрана в различные
текстовые и графические режимы. Режимы отличаются друг от друга
разрешением (для графических) и количеством строк и столбцов (для
текстовых), а также количеством возможных цветов.
INT 10h, АН = 00 — Установить видеорежим
Ввод:
AL = номер режима в младших 7 битах
Вывод:
Обычно никакого, но некоторые BIOS (Phoenix и AMI)
помещают в AL 30Н для текстовых режимов и 20h для
графических
Вызов этой функции приводит к тому, что экран переводится в
выбранный режим. Если старший бит AL не установлен в 1, экран
очищается. Номера текстовых режимов — 0, 1, 2, 3 и 7. 0 и 1 — 16-цветные
режимы 40x25 (с 25 строками по 40 символов в строке), 2 и 3 — 16-цветные
10
режимы 80x25, 7 — монохромный режим 80x25. Мы не будем пока
рассматривать графические режимы, хотя функции вывода текста на экран
DOS и BIOS могут работать и в них. Существует еще много текстовых
режимов с более высоким разрешением (80x43, 80x60, 132x50 и т.д.), но их
номера для вызова через эту функцию различны для разных видеоадаптеров
(например, режим 61h — 132x50 для Cirrus 5320 и 132x29 для Genoa 6400).
Однако, если видеоадаптер поддерживает стандарт VESA BIOS Extention, в
режимы с высоким разрешением можно переключаться, используя функцию
4Fh.
INT 10h, АН = 4Fh, AL = 02 — Установить SuperVGA-видеорежим
Ввод:
ВХ = номер режима в младших 13 битах
Вывод:
AL
=
АН
=
4Fh,
0,
если
если
эта
функция
переключение
поддерживается
произошло
успешно
АН = 1, если произошла ошибка
Если бит 15 регистра ВХ установлен в 1, видеопамять не очищается.
Текстовые режимы, которые можно вызвать с использованием этой
функции: 80x60 (режим 108h), 132x25 (109h), 132x43 (10Ah), 132x50 (10Bh),
132x60 (10Ch).
Системный таймер
Начиная с IBM AT, персональные компьютеры содержат два
устройства для управления процессами — часы реального времени (RTC) и
собственно системный таймер. Часы реального времени получают питание
от аккумулятора на материнской плате и работают даже тогда, когда
компьютер
выключен.
Это
устройство
можно
использовать
для
определения/установки текущих даты и времени, установки будильника с
целью выполнения каких-либо действий и для вызова прерывания IRQ8
(INT 4Ah)
каждую
миллисекунду.
11
Системный
таймер
используется
одновременно для управления контроллером прямого доступа к памяти, для
управления
динамиком
и
как
генератор
импульсов,
вызывающий
прерывание IRQ0 (INT 8h) 18,2 раза в секунду. Таймер предоставляет
богатые возможности для препрограммирования на уровне портов вводавывода, но на уровне DOS и BIOS и часы реального времени, и системный
таймер используются только как средство определения/установки текущего
времени и организации задержек.
Функция DOS 2Ah — Определить дату
Ввод:
AX = 2Ah
Вывод:
СХ = год (1980 – 2099)
DH = месяц
DL = день
AL = день недели (0 — воскресенье, 1 — понедельник...)
Функция DOS 2Ch — Определить время
Ввод:
AX = 2Ch
Вывод:
СН = час
CL = минута
DH = секунда
DL = сотая доля секунды
Эта функция использует системный таймер, так что время изменяется
только 18,2 раза в секунду и число в DL увеличивается сразу на 5 или 6.
Функция DOS 2Bh — Установить дату
Ввод:
АН = 2Bh
СХ = год (1980 – 2099)
DH = месяц
12
DL = день
Вы
вод:
АН = FFh, если введена несуществующая дата,
АН = 00h, если дата установлена
Функция DOS 2Dh — Установить время
Ввод:
АН = 2Dh
СН = час
CL = минута
DH = секунда
DL = сотая доля секунды
Вывод:
AL = FFh, если введено несуществующее время,
AL = 00h, если время установлено
Функции 2Bh и 2Dh устанавливают одновременно как внутренние
часы DOS, которые управляются системным таймером и обновляются 18,2
раза в секунду, так и часы реального времени. BIOS позволяет управлять
часами напрямую:
INT 1Ah АН = 04h — Определить дату RTC
Ввод:
АН = 04h
Вывод:
CF = 0, если дата прочитана
СХ = год (в формате BCD, то есть 1998h для 1998-го года)
DH = месяц (в формате BCD)
DL = день (в формате BCD)
CF = 1, если часы не работают или попытка чтения пришлась на
момент обновления
INT 1Ah АН = 02h — Определить время RTC
13
Ввод:
АН = 02h
Вывод:
CF = 0, если время прочитано
СН = час (в формате BCD)
CL = минута (в формате BCD)
DH = секунда (в формате BCD)
DL = 01h, если действует летнее время, 00h, если нет
CF = 1, если часы не работают или попытка чтения пришлась на
момент обновления
INT 1Ah АН = 05h — Установить дату RTC
Ввод:
АН = 05h
СХ = год (в формате BCD)
DH = месяц
DL = день
INT 1Ah АН = 03h — Установить время RTC
Ввод:
АН = 03h
СН = час (в формате BCD)
CL = минута (в формате BCD)
DH = секунда (в формате BCD)
DL = 01h, если используется летнее время, 0 — если нет
14
Постановка задачи
Задачей данной курсовой работы является повышение навыков
программирования на языке ассемблера. В качестве результата необходимо
предоставить программу «Часы реального времени», в формате внешних
часов с циферблатом, написанной на языке ассемблер.
Описание программы
Общие сведения
Программа имеет название «Clock» и хранится на диске под именем
clock.com, занимает 136 килобайт. Для функционирования программы
необходимо выполнение следующих условий:
1. Операционная система MS_DOS 6.22 (Windows 95/98/2000).
2.
IBM – совместимый персональный компьютер.
VGA – совместимый адаптер, наличие сопроцессора.
Описание логической структуры
Алгоритм программы
1. Вывод титульного листа
2. Ожидание нажатия клавиши. Очистка экрана
3. Вывод текущего времени в виде часов с циферблатом,
оснащенным тремя стрелками (часовой, минутной, секундной).
4. Выход в ОС осуществляется при нажатии клавиши ESC.
15
Структура программы с описанием основных
процедур
Программа состоит из файла с названием 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.
OutFiga - Выводит цифры на циферблате в указанной позиции
15.
Number - Подготовка к выводу цифер на циферблате по
окружности
16.
Circul - Отображает окружность по центральной точке и
радиусу
17.
PlotFiga - Выводит точки на циферблате
18.
Time - Загружает текущие время в поля данных
16
Инструкция пользователю
Запуск программы
Запуск программы осуществляется путем запуска соответствующего
исполняемого («Clock.exe») файла любым применяемым для запуска файлов
способом.
Порядок работы
После запуска программы на экране появится титульный лист с
описанием задания и другой информации по данной курсовой работе работе.
После нажатия любой клавиши на экране отобразится циферблат с
тремя стрелками: часовой, минутной и секундной, отличающимися между
собой по длине и цвету.
При нажатии клавиши ESC произойдет выход из программы.
17
Заключение
В ходе выполнения данного курсового проекта мною была разработана
программа «Часы реального времени» в формате часов с циферблатом,
оснащенных тремя стрелками, реализующая все поставленные перед ней
задачи, имеющая удобный пользовательский интерфейс и довольно низкие
системные требования.
Процесс разработки и реализации различных алгоритмов, которые были
использованы в данной курсовой работе, был для меня очень увлекательным
и интересным.
18
Приложение
kurs
segment
public para 'code'
assume cs:kyrs,ds:kyrs,ss:kyrs,es:kers
org
100h
.386
START:
JMP GO
TX
dw
0
;Текущий X
TY
dw
0
;Текущий Y
COLOR
dw
UGOL DD
0
RAD DD
0
RESULT
dd
;Текущий цвет
5
;Текущий угол
; Текущий радиус
; Временная переменная для хранения
0
; результатов работы с сопроцессором
RESULTX
dd
0
; Результат для координаты x
RESULTY
dd
0
; Результат для координаты y
COS
dd
0
;Результат вычисления косинуса угла
SIN
dd
0
;Результат вычисления синуса угла
STEPX
dd
(?)
;Шаг по X
STEPY
dd
(?)
;Шаг по Y
XC
dd
311
;Центр по X
YC
dd
230
;Центр по Y
UGOLCEK
dd
0
;Угол секундной стрелки
UGOLMIN
dd
0
;Угол минутной стрелки
UGOLCH
dd
0
;Угол часовойой стрелки
CurCek
db
0
;Текушее количество секунд (RTC)
CurCH
db
0
;Текушее количество часов (RTC)
CurMIN
db
0
;Текушее количество минут (RTC)
RADCEK
dd
100
;Радиус секундной стрелки
RADMIN
dd
90
;Радиус минутной стрелки
dd
80
;Радиус часовой стрелки
COLORCEK dw
15
;Цвет секундной стрелки
COLORMIN dw
5
;Цвет секундной стрелки
COLORCH
5
;Цвет секундной стрелки
RADCH
dw
Очистка экрана
ClrScr proc
19
mov ax,0600h
mov bh,07
mov cx,0000
mov dx,184Fh
int 10h
ret
ClrScr endp
Вывод строки на экран
OutStr proc
mov ah,09
;помешает в ah число 09(номер функции DOS вывода строки)
int 21h
;вызов системной функции DOS
ret
;возращение из процедуры
OutStr endp
OutChr
proc
push ax
;помещает ах в стек
mov ah,02h
;помешает в ah число 02h(номер функции DOS вывода
int 21h
;вызов системной функции DOS
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
20
Вывод десятичного числа на экран из dx
OutDec
_lp:
_l1:
proc
mov
eax, edx
mov
ebx, 10
xor
cx, cx
cdq
div
ebx
add
dx , 30h
push
dx
inc
cx
or
eax, eax
jnz
_lp
pop
dx
call
OutChr
loop
_l1
ret;возвращение из процедуры
OutDec
endp
Вывод титульника
Titul proc
;Очистка экрана
call
ClrScr
mov
dh , 00 ;пол. курсора 00-строка
mov
dl , 22
;столбец
call
cursor
;вызов процедуры установки курсора в нужную позицию
lea
dx , Str1 ;dx=адрес строки
call
OutStr
mov
dh , 03
mov
dl , 13
call
cursor
lea
dx , Str2
call
OutStr
mov
dh , 07
mov
dl , 28
call
cursor
lea
dx , Str4
call
OutStr
mov
dh , 09
;процедура выводы строки на экран
21
mov
dl , 31
call
cursor
lea
dx , Str5
call
OutStr
mov
dh , 12
mov
dl , 23
call
cursor
lea
dx , Str6
call
OutStr
mov
dh , 16
mov
dl , 48
call
cursor
lea
dx , Str7
call
OutStr
mov
dh , 19
mov
dl , 65
call
cursor
lea
dx , Str8
call
OutStr
mov
dh , 21
mov
dl , 33
call
cursor
lea
dx , Str9
call
OutStr
mov
dh , 24
mov
dl , 33
call
cursor
lea
dx , Str10
call
OutStr
call
PressAnyKey ;вызов процедуры ожидания наж. клавиши
ret;возвращение из процедуры
Str1 db 'Министерство образования РФ',24h
; 24h = $
Str2 db 'Брянский государственный технический университет',24h
Str4 db 'Курсовая работа',24h
Str5 db 'По теме ',24h
Str6 db 'Часы реального времени ',24h
22
Str7 db '‚Выполнила студентка гр.06ПО4',24h
Str8 db 'Жукова Н.И',24h
Str9 db 'г. Брянск',24h
Str10 db '2007 год',24h
Titul endp
Затирает старые стрелки и отображает на новом месте
OutCros
proc
pusha ;поместить в стек все регистры общего назначения
mov
bx , offset COLOR
;адрес COLOR в dx
mov
eax , 0
; eax=0
mov
[bx] , eax
fild
UGOLCEK
;загрузить число UGOLCEK в стек
fistp
UGOL
;считать число из стека и записать в UGOL
fild
RADCEK
; загрузить число RADCEK в стек
fistp
RAD
; считать число из стека и записать в RAD
call
Line
;вызов процедуры отображения линии
fild
UGOLMIN
fistp
UGOL
fild
RADMIN
fistp
RAD
call
Line
fild
UGOLCH
fistp
UGOL
fild
RADCH
fistp
RAD
call
Line
fild
UGOLMIN
fistp
UGOL
fild
RADMIN
fistp
RAD
fild
COLORMIN
fistp
COLOR
call
Line
fild
UGOLCH
fistp
UGOL
fild
RADCH
23
fistp
RAD
fild
COLORCH
fistp
COLOR
call
Line
fild
UGOLCEK
fistp
UGOL
fild
RADCEK
fistp
RAD
fild
COLORCEK
fistp
COLOR
call
Line
popa
ret;возвращение из процедуры
OutCros
endp
Устанавливает углы для стрелок в зависимости от текущего времени
CurUgols
proc
pusha;поместить в стек все регистры общего назначения
mov
cl , CurCek[0] ;в cl заносится текущее кол-во секунд
mov
ax , 6 ;в ax заносится число 6 (расстояние между 2 точками)
mul
cl
mov
bx , offset UGOLCEK;адрес UGOLCEK в bx
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
;ax=ax*cl
24
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; eax=180
mov
[bx] , eax $RESULT=180
fild
RESULT;загрузить в стек
;разделить 180\пи
fdiv
fild
UGOL
;умножить UGOL на рез. 180\пи
fmul
fstp
;занести в стек
UGOL;считать из стека и занести в UGOL
;извлечь из стека все регистры общего назначения
popa
ret;возвращение из процедуры
GradToRad endp
Вычисляет синус и косинус
SinCos proc
pusha ;поместить в стек все регистры общего назначения
mov
eax , 90 ;eax=90
lea
bx , RESULT; bx адрес RESULT
25
mov
[bx] , eax ; RESULT=90
fild
RESULT ;заносим RESULT в стек
fild
UGOL ; заносим в UGOL стек
fsubr; UGOL= RESULT- UGOL
fistp
UGOL;считывает зн. ST(0) из стека и зан. в UGOL
call
GradToRad;вызов процедуры перевода радиан в градусы
fld
UGOL; UGOL помещает в стек
fsincos ;вычисляет sin, cos UGOL
fstp
COS
;считывает из стека
fstp
SIN
;считывает из стека
popa ;загрузить из стека все регистры общ. наз
ret ;возвращение из процедуры
SinCos endp
Отображает точку на экране
Plot
proc
pusha ;поместить в стек все регистры общего назначения
lea
bx , TY; bx= адрес TY
mov
dx , [bx] ;dx=TY номер строки
lea
bx , TX ;dx= адрес TX
mov
cx , [bx]; cx=TX номер столбца
lea
bx , COLOR
mov
ax , [bx] ;цвет номера
xor
bx , bx
mov
bh , 0 ; номер видео страницы=0
mov
ah , 0ch ;отображение точки на экране
int
10h
; вызов функции
popa
ret;возвращение из процедуры
Plot
endp
Отображает линию по начальной точке, углу и радиусу
Line
proc
pusha ;поместить в стек все регистры общего назначения
;вычисляет синус и косинус
call
SINCOS
mov
bx , offset RAD;bx=адрес RAD
mov
cx , [bx]
GO_LOOP:
26
mov
bx , offset RESULT
mov
[bx] , ecx
fild
RESULT
fmul
COS
fiadd XC
fistp
TX
;TX=XC+Resuls*Coc
mov
bx , offset RESULT
mov
[bx] , ecx
fild
RESULT
fmul
SIN
fiadd YC
fistp
TY;TY=YC+Resuls*sin
call
Plot;отображает точку на экране
loop
GO_LOOP
popa
ret;возвращение из процедуры
Line
endp
Выводит цифры на циферблате в указанной позиции
OutFiga 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
popa
call
OutDec
popa
ret;возвращение из процедуры
OutFiga
endp
27
Подготовка к выводу цифр на циферблате по окружности
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
fiadd YC
fistp
TY
cmp
ecx , 2
JMP
NUMEND
NUMNEXT:
mov
eax , 3
mul
cl
mov
edx , eax
call
OutFiga
NUMEND:
loop NumCur
popa
ret;возвращение из процедуры
Number
endp
28
Отображает окружность по центральной точке и радиусу
Circul proc
pusha ;поместить в стек все регистры общего назначения
mov
bx , offset RAD
;bx=адрес RAD
mov
edx , [bx]
;edx=RAD
mov
ecx , 360
;ecx=360
mov
bx , offset UGOL
;bx=адрес UGOL
mov
[bx] , ecx
;bx=ecx
call
SINCOS
;вызов процедура выч. синуса и косинуса
mov
bx , offset RESULT ;bx=адрес
mov
[bx] , edx
fild
RESULT;занести в стек
fmul
COS;умножить на косинус
Cur:
;bx=edx
fiadd XC;сложить
fistp
TX;(номер стобца)ТХ= XC+ RESULT* COS
mov
bx , offset RESULT ;bx=адрес
mov
[bx] , edx
fild
RESULT
fmul
SIN
;bx=edx
fiadd YC
;(номер строки)ТY= YC+ RESULT* SIN;
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
29
mul
cl
mov
bx , offset UGOL
mov
[bx] , eax
call
SINCOS
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
;определение времени RTS
mov
ah , 2ch
int
21h
cmp
dh , CurCek[0]
; если dh= CurCek[0] т.е. время прочитано, то
je
TIMEEND
;на метку TIMEEND
mov
CurCH[0] , ch
mov
CurMIN[0] , cl
mov
CurCek[0] , dh
;час
;минута
;секунда
TIMEEND:
popa
ret
;загрузить из стека все регистры общего назначения
;возвращение из процедуры
Time endp
GO:
30
Titul ; Вывод титульника
Call
;Устанавливаем новый видеорежим: 640x480, 16 цветов
mov
ax ,4f02h
;функция установки режима
mov
bx , 12h
;номер режима 640x480
int
10h
;Отрисовка основной окружности
mov
eax , 145
;радиус окружности
lea
bx , RAD
;вычисляет адрес RAD и заносит его в bx
mov
[bx] , eax
;bx=eaх
call Circul
;вызов процедуры отображ. окр. по центральной точке
и радиусу
;Отрисовка циферблата
mov
eax , 130
;радиус окружности циферблата
lea
bx , RAD
;вычисляет адрес RAD и заносит его в bx
mov
[bx] , eax
;bx=eaх
call
PlotFiga
;вызов процедуры вывода точки на циферблат
call
Number
Основной цикл
;вызов процедуры под. к выводу цифр на циферблате
xor
;обнуление регистра cx
cx , cx
MAINLOOP:
call
Time
;вызов проц. отрисовки текущего времени
;Считывание символа
in
al , 60h
push
ax
cmp
al , 1h
;проверяем нажатие ESC
jnz
MAINLOOP
;если нет то продолжаем цикл
mov ah,4ch
;Выход в DOS
шnt 21h
kurs
ends
end start
31
Литература
1.
Беспалов П.В, Горин С.В, Коновалов С.М., «Программирование на
языке Ассемблер», М. “Высшая школа”, 1993г.
2.
Зубков, «Язык ассемблера для DOS, WINDOWS, UNIX», М. “ДМК”,
2000г.
3.
Нортон П., «Персональный компьютер фирмы IBM и операционная
система M-DOS», М. “Радио и связь”, 1991г.
4.
Нортон П., «Язык ассемблера для IBM PC», М. “Радио и связь”,
1990г.
5.
Питер Абель «Язык Ассемблера для IBM PC и программирования»,
М. “Высшая школа”, 1992г.
6.
Юров В., Хорошенко С., “Ассемблер. Учебный курс”, С.-П. “Питер”,
1999г.
Юров В.И. «Ассемблер: практикум», СПб.: «Питер», 2003 г.
32
Download