INFONKO.RU

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

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

Поля регистра Описание
Поле 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

#include

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 ; временно извлекаем адрес возврата



infonko.ru/funkcii-i-arhitektura-sistem-upravleniya.html infonko.ru/funkcii-i-biznes-processi-model-funkcij-kompanii-osnovannaya-na-vidah-ed-iz-okved.html infonko.ru/funkcii-i-celi-sravnitelnogo-prava.html infonko.ru/funkcii-i-issledovatelskie-zadachi-kazhdoj-shlyapi.html infonko.ru/funkcii-i-kompetenciya-prezidenta-respubliki-belarus.html infonko.ru/funkcii-i-mehanizm-upravleniya-pribilyu-predpriyatiya.html infonko.ru/funkcii-i-metodi-deyatelnosti-organov-ispolnitelnoj-vlasti-ponyatie-i-vidi.html infonko.ru/funkcii-i-metodi-menedzhmenta.html infonko.ru/funkcii-i-metodi-upravleniya-personalom.html infonko.ru/funkcii-infinitiva-v-predlozhenii.html infonko.ru/funkcii-i-organizacionnaya-struktura-gosudarstvennogo-upravleniya.html infonko.ru/funkcii-i-osnovnie-elementi-nalogooblozheniya.html infonko.ru/funkcii-i-osnovnie-principi-grazhdanskogo-prava.html infonko.ru/funkcii-i-otvetstvennost-podrazdelenij-po-obespecheniyu-i-kontrolyu-kachestva.html infonko.ru/funkcii-i-podfunkcii-yuridicheskoj-praktiki.html infonko.ru/funkcii-i-polnomochiya-glavnih-organov-oon.html infonko.ru/funkcii-i-principi-marketinga.html infonko.ru/funkcii-i-principi-medicinskogo-prava.html infonko.ru/funkcii-i-principi-upravleniya-a-fajolya.html infonko.ru/funkcii-i-rol-rinka-v-hozyajstvennoj-zhizni-strani-ego-ogranichennost.html