|
Формат управляющего регистра ⇐ ПредыдущаяСтр 9 из 9 Приведем формат управляющего регистра:
Поле BCD определяет формат константы, использующейся для счета - двоичный или двоично-десятичный. В двоично-десятичном режиме константа задается в диапазоне 1-9999. Поле M определяет режимы работы таймера: · 0 - прерывание от таймера; · 1 - программируемый ждущий мультивибратор; · 2 - программируемый генератор импульсов; · 3 - генератор меандра; · 4 - программно-запускаемый одновибратор; · 5 - аппаратно-запускаемый одновибратор Мы будем рассматривать только режим 3, так как именно он используется в каналах 0 и 2. Поле RW определяет способ загрузки констант через однобайтовый порт. Если в этом поле задано значение 00, это управляющее слово будет использоваться для фиксации текущего содержимого регистров счетчика CE в буферном регистре OL с целью чтения программой. Это код команды CLC - фиксация регистров. Код канала, для которого будет выполняться фиксация, должен быть указан в поле SC. Поля M и BCD при этом не используются. Поле SC определяет номер канала, для которого предназначено управляющее слово. Если в этом поле задано значение 11, будет выполняться чтение состояния канала. Формат команды чтения слова состояния канала С помощью команды чтения слова состояния канала вы можете выполнять операции чтения состояния каналов либо запоминание регистра счетчика CE каналов. Можно выполнять эти операции как для отдельных каналов, так и для всех каналов одновременно. Приведем формат команды RBC чтения слова состояния канала:
Формат слова состояния канала Формат слова состояния канала напоминает формат регистра управляющего слова, за исключением двух старших разрядов 7 и 6:
Разряд FN используется, в основном, в режимах 1 и 5 для определения, произошла ли загрузка константы из регистра CR в регистр счетчика CE. Разряд OUT позволяет определить состояние выходной линии канала OUT в момент выполнения команды RBC. Последовательность действий Для программирования канала таймера необходимо выполнить следующую последовательность действий: · вывести в порт управляющего регистра с адресом 43h управляющее слово; · требуемое значение счетчика посылается в порт канала (адреса 40h-42h), причем вначале выводится младший, а затем старший байты значения счетчика. Сразу после этого канал таймера начнет выполнять требуемую функцию. Для чтения текущего содержимого счетчика CE необходимо выполнить следующее: · вывести в порт управляющего регистра код команды CLC (команда запоминания содержимого регистра CE); · вывести в порт управляющего регистра код команды запроса на чтение/запись в регистры канала (поле RW должно содержать 11); · двумя последовательными командами ввода из порта нужного канала ввести младший и старший байты текущего сосотояния счетчика CE. Программа TIMERST Приведем исходный текст программы TIMERST, отображающей слово состояния и содержимое счетчика для всех трех каналов таймера (листинг 1.1). Листинг 1.1. Файл timerst\timerst.с #include <stdio.h> #include <conio.h> Int main() { unsigned i; printf("\n\nКанал 0\n-------\n"); // Читаем слово состояния канала, // команда 0xe2 = 11100010B outp(0x43, 0xe2); printf("\nСлово состояния канала: %02.2X", inp(0x40)); // Читаем текущее состояние регистра счетчика // канала. Для этого вначале выдаем команду CLC // для канала 0. Код этой команды - 0x00 outp(0x43, 0x00); // Вводим младший и старший байты счетчика // и отображаем его. i = inp(0x40); i = (inp(0x40) << 8) + i; printf("\nРегистр счетчика: %04.4X",i); // Повторяем те же действия для 1 и 2 каналов. printf("\n\nКанал 1\n-------\n"); outp(0x43, 0xe4); printf("\nСлово состояния канала: %02.2X",inp(0x41)); outp(0x43, 0x40); i = inp(0x41); i = (inp(0x41) << 8) + i; printf("\nРегистр счетчика: %04.4X",i); printf("\n\nКанал 2\n-------\n"); outp(0x43, 0xe8); printf("\nСлово состояния канала: %02.2X",inp(0x42)); outp(0x43, 0x80); i = inp(0x42); i = (inp(0x42) << 8) + i; printf("\nРегистр счетчика: %04.4X",i); return 0; }
Задание 1 Определить отображающее слово состояния и содержимое счетчика для всех трех каналов таймера.
5 Контрольные вопросы 1 Микросхемы таймера 8253 и 8254. 2 Режимы работы таймера. 3 Каналы таймера. Формат команды чтения слова состояния канала.
Лабораторная работа №9 Организация работы с процедурами Цель работы Организация ввода-вывода информации с использованием операций процедуры. Теоретические основы Процедуры на языке ассемблера На языке ассемблера процедура оформляется следующим образом: Метка proc тип_адресации ;тело процедуры Метка endp Пример 1 Программа, содержащая процедуру PrintWord, которая печатает на экране "Hello, World!". CodeSg segment 'Code' Assume CS:CodeSg, DS:DataSg, SS:StackSg ; Begin: mov AX, DataSg Mov DS, AX Mov AX, StackSg Mov SS, AX ; Call PrintWord ; Mov AX, 4C00h Int 21h ; PrintWord proc ; Mov AH, 09h Mov DX, offset message Int 21h Ret ; PrintWord endp ; CodeSg ends ;--------------------------------------- DataSg segment 'Data' ; message db 'Hellow, World!', '$' ; DataSg ends ;--------------------------------------- StackSg segment Stack 'Stack' ; Db 256 dup(0) ; StackSg ends End begin Пример 2 Основную часть программы также можно оформлять в виде процедуры: Main proc far ; тело основной программы Main endp End Main При этом команда ret не используется, а в качестве точки входа необходимо указать имя главной процедуры. CodeSg segment 'Code' Assume CS:CodeSg, DS:DataSg, SS:StackSg Main proc far ; Mov AX, DataSg Mov DS, AX Mov AX, StackSg Mov SS, AX ; Call PrintWord ; Mov AX, 4C00h Int 21h ; Main endp PrintWord proc ; Mov AH, 09h Mov DX, offset message Int 21h Ret ; PrintWord endp CodeSg ends ;-------------------------------------------------------------------------- DataSg segment 'Data' ; message db 'Hellow, World!', '$' ; DataSg ends ;-------------------------------------------------------------------------- StackSg segment Stack 'Stack' ; Db 256 dup(0) ; StackSg ends ;-------------------------------------------------------------------------- End Main Сравните с помощью отладчика результирующий код программ из приведённых выше примеров. Способы передачи параметров в процедуры Часто в подпрограммы необходимо передавать параметры. Существует три основных способа: • через регистры; • через стек; • через общие области памяти. Пусть в подпрограмму Y нужно передать параметр X. Тогда это можно сделать так: Пример передачи параметров через регистры Mov AX, X; параметр X в регистр AX Call Y; вызов процедуры Y ;---------------------------------------------- Y proc Inc AX; некоторое действие с параметром Ret; возврат из процедуры Y endp ;---------------------------------------------- X dw 0 В этом примере для передачи параметра X используется регистр AX, с которым процедура выполняет некоторое действие и возвращает ответ также через регистр AX. Пример передачи параметров через стек Push X; параметр X в стек Call Y; вызов процедуры Y ;----------------------------------------------------- Y proc Pop BX; временно извлекаем адрес возврата Конфликты в семейной жизни. Как это изменить? Редкий брак и взаимоотношения существуют без конфликтов и напряженности. Через это проходят все... Что способствует осуществлению желаний? Стопроцентная, непоколебимая уверенность в своем... ЧТО ТАКОЕ УВЕРЕННОЕ ПОВЕДЕНИЕ В МЕЖЛИЧНОСТНЫХ ОТНОШЕНИЯХ? Исторически существует три основных модели различий, существующих между... ЧТО И КАК ПИСАЛИ О МОДЕ В ЖУРНАЛАХ НАЧАЛА XX ВЕКА Первый номер журнала «Аполлон» за 1909 г. начинался, по сути, с программного заявления редакции журнала... Не нашли то, что искали? Воспользуйтесь поиском гугл на сайте:
|