ФЕДЕРАЛЬНОЕ АГЕНСТВО ПО НАУКЕ И ОБРАЗОВАНИЮ РОССИЙСКОЙ ФЕДЕРАЦИИ БРЯНСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ Курсовая работа по дисциплине «Организация ЭВМ» на тему «Часы реального времени» Выполнила: студентка гр. 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