Здавалка
Главная | Обратная связь

Задержка программных операций



Программные задержки используются в тех случаях, когда в какой-либо точке программы надо приостановить её выполнение на некоторое время. По виду исполнения программные задержки делятся на два типа: задержки, реализуемые на основе выполнения программой "пустых" вложенных циклов, и задержки, реализуемые на основе системного таймера компьютера. В листинге 1 приведён пример реализации задержки первого типа.

Листинг 1. Программная задержка на основе выполнения вложенных циклов с командой Loop.

proc delay ; Подпрограмма задержки

mov cx, N ; N – счётчик внешнего цикла

outer:

push cx ; Сохраним содержание счётчик внешнего цикла

mov cx,0 ; Обеспечим максимальное число

; повторений (64К раз) внутреннего цикла

inner:

loop Inner ; Внутренний цикл

pop cx ; Восстановим содержание счётчик внешнего цикла

loop outer ;Повторим вешний цикл N раз

endp delay

 

В листинге 1 параметр N выполняет роль масштабного множителя времени задержки:

tзадержки = N*tисполнения внутреннего цикла.

При этом наименьшей единицей времени (т.е. "тиком") является время выполнения внутреннего цикла, состоящего, в свою очередь, из времени исполнения 65535 раз команды Loop. Параметр N подбирается экспериментально для получения tзадержки (в мсек или сек) с учётом быстродействия конкретного компьютера.

Из рассмотрения данного примера очевидны недостатки данного подхода, когда требуется обеспечить выполнение временной задержки в программе, независимо от типа используемого компьютера. Поэтому разумно определять время программной задержки непосредственно по таймеру. Выходные сигналы таймера с частотой 18,2 раза в секунду не зависят от производительности компьютера и играют роль счетчика суточного времени. Реализация данного способа использует функцию 00h прерывания BIOS int 1Ah.

Int 1Аh, функция 00h. Чтение счетчика циклов таймера. Обработчик прерывания BIOS от системного таймера (int 8) подсчитывает количество прерываний (каждые 55 мсек или 18,2 раза в секунду) в двойном слове памяти с адресом 0040h:006Сh. Данная функция возвращает накопленное значение (двоичный код) и сбрасывает его в 0. В регистре AL возвращается 0, если содержимое счетчика не превысило значения, соответствующего 24 часам (при достижении этого значения счетчик сбрасывается), иначе возвращается AL = 1.

Вызов: АН = 00h.

Возврат: СХ:DX – число тактов системного времени от полуночи,

AL – флаг перехода через сутки.

Примеры возвращаемых значений в СХ:DX:

1 сек 12h или 18,

1 минута 04 44h или 1092,

1 час 1 00 07h или 65543,

24 часа 18 00 B0h или 1 573 040.

Для задержек, меньших 14 секунд, можно пользоваться только младшим байтом регистра DX.

Листинг 2. B данном примере установлена задержка на 5 секунд, что соответствует 91 отсчету таймера

mov ah,0 ; Функция "чтения" циклов таймера

int 1Ah ; Получаем значение счетчика циклов в cx:dx

add dx,91 ; Добавляем 5 сек. к младшему слову в dx

mov bx,dx ; Запоминаем требуемое значение в bx и

; выполняем постоянную проверку значений

; счетчика времени суток

repeat:

int 1Ah ; Вновь получаем значение счетчика

cmp dx,bx ; Сравниваем с искомым

jne repeat ; Если не равно, то повторяем снова,

; иначе задержка окончена

 

Если требуется введение задержки с высокой точностью, то необходимо использовать функцию 86h прерывания BIOS int 15h. Она позволяет определить время задержки в микросекундах. Во время выполнения задержки разрешены прерывания. Управление программе возвращается после истечения заданного времени.

Int 15h, функция 86h.

Вызов: AH = 86h, СX:DX = время задержки в мксек.

Возврат: CF = 0 – нормальное исполнение, CF = 1 – функция не поддерживается.

Пример: CX:DX = 0098h:9680h = 10 000 000 мксек = 10 сек.

Примеры

Пример 1

Рассмотрим лишь один наиболее простой и употребительный графический режим VGA 320x200, 256 цветов. В нём каждый пиксель описывается одним байтом, значение которого определяет цвет пикселя.

Переход в графический режим VGA 320x200, 256 цветов осуществляется при помощи функции 00h прерывания BIOS 10h установкой режима 13h.

Приведём программу, которая в графическом режиме 13h рисует две прямые линии: одну красную горизонтальную, другую зелёную под углом 45°. Эта программа демонстрирует отображение пикселей как с помощью BIOS (функция 0Ch прерывания 10h), так и с помощью непосредственного обращения к видеопамяти. Второй способ действует гораздо быстрее первого.

Рассмотрим соответствие байтов видеопамяти и позиций пикселей на экране. Пусть m=0, 1, …, 319 – номер пикселя в строке, n=0, 1, …, 200 – номер строки пикселей. Тогда смещение относительно начала видеопамяти байта, соответствующего m-му пикселю в n-й строке будет m+320*n.

 

putpix macro x,y,color ; Пиксель при помощи BIOS

mov cx,x

mov dx,y

mov al,color

mov ah,0Ch

int 10h

endm

 

.model small

.code

prg:

mov ax,0A000h

mov es,ax ; Настройка ES на видеопамять

mov ax,0013h

int 10h ; В графический режим 13h

mov cx,200 ; Линии в 200 пикселей

xor si,si

rpt:

push cx

putpix si,si,2 ; При помощи BIOS

mov es:[si]+32000,byte ptr 4 ; В видеопамять

inc si

pop cx

loop rpt ; Повторить 200 раз

mov ah,08h

int 21h ; Задержка до нажатия клавиши

mov ax,0003h

int 10h ; В текстовый режим 03h

mov ax,4Ch

int 21h ; Возврат в DOS

.stack 256

end prg

Пример 2

При вызове функции 0Ch прерывания 10h в регистр BH заносится номер видеостраницы, на которую выводится данная точка. По умолчанию активной является страница 0, однако рисовать изображение можно как на активной, так и на не активной странице. Для переключения страниц предусмотрена функция 05h прерывания 10h.

 

putpix macro x,y,color,page

mov cx,x

mov dx,y

mov al,color

mov bh,page

mov ah,0Ch

int 10h

endm

 

.model small

.code

prg:

mov ax,0A000h

mov ax,000Dh

int 10h

 

mov bx,1

lbl_page:

push bx

mov cx,200

xor si,si

rpt:

push cx

putpix si,si,bl,bl

inc si

pop cx

loop rpt

pop bx

inc bx

cmp bx,8

jne lbl_page

 

mov cx,7

lbl_draw:

mov ah,05h ; функция выбора активной страницы

mov al,cl

int 10h

mov ah,08h ; ожидание нажатия клавиши

int 21h

loop lbl_draw

 

mov ax,0003h ; в текстовый режим

int 10h

mov ax,4Ch

int 21h ; возврат в DOS

.stack 256

end prg

Литература

  1. Фролов А.В., Фролов Г.В. Программирование видеоадаптеров. Библиотека системного программиста. Том 21. – М.: Диалог-МИФИ, 1993.
  2. Митницкий В.Я. Архитектура IBM PC и язык Ассемблера: Учеб. пособие. – М.: МФТИ, 2000. – 148 с.
  3. Рудаков П.И., Финогенов К.Г. Язык ассемблера: уроки программирования. – М.: ДИАЛОГ-МИФИ, 2001. – 640 с.
  4. Ассемблер IBM PC. – http://mini-soft.ru/book/assem/index.php.






©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.