Сдам Сам

ПОЛЕЗНОЕ


КАТЕГОРИИ







Формат управляющего регистра





Приведем формат управляющего регистра:

Поля регистра Описание
  Поле BCD: 0 - двоичный режим; 1 - двоично-десятичный режим
1-3 Поле M: 000 - режим 0; 001 - режим 1; X10 - режим 2; X11 - режим 3; 100 - режим 4; 101 - режим 5
4-5 Поле RW: 00 - код команды CLC (запомнить CE); 01 - чтение/запись старшего байта; 10 - чтение/запись младшего байта; 11 - чтение/запись младшего, затем старшего байта
6-7 Поле SC: 00 - канал 0; 01 - канал 1; 10 - канал 2; 11 - код команды RBC (чтение состояния канала)

Поле 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 чтения слова состояния канала:

Поле Описание
  Всегда равно 0
  1 - выбор канала 0
  1 - выбор канала 1
  1 - выбор канала 2
  Поле STAT: 0 - читать состояние каналов; 1 - не читать состояние каналов
  Поле CNT: 0 - запомнить текущее содержимое CE; 1 - не запоминать содержимое CE
6-7 код команды RBC - 11

Формат слова состояния канала

Формат слова состояния канала напоминает формат регистра управляющего слова, за исключением двух старших разрядов 7 и 6:

Поля регистра Описание
  Поле BCD: 0 - двоичный режим; 1 - двоично-десятичный режим
1-3 Поле M: 000 - режим 0; 001 - режим 1; X10 - режим 2; X11 - режим 3; 100 - режим 4; 101 - режим 5
4-5 Поле RW: 00 - код команды CLC (запомнить CE); 01 - чтение/запись старшего байта; 10 - чтение/запись младшего байта; 11 - чтение/запись младшего, затем старшего байта
  FN: флаг перезагрузки констант
  OUT: состояние выхода OUT

 

Разряд 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 г. начинался, по сути, с программного заявления редакции журнала...





Не нашли то, что искали? Воспользуйтесь поиском гугл на сайте:


©2015- 2024 zdamsam.ru Размещенные материалы защищены законодательством РФ.