Goto... Search.. Hext Change.. Follou Previous 8 глава


раз. Прямое воззвание к видеобуферу комфортно использовать, к примеру, в обработчиках прерываний, где запрещен вызов функций DOS и имеются ограничения на воззвание к средствам BIOS.

Пусть по ходу программки нужно вывести в нижнюю строчку эк­рана предупреждающее сообщение. Для этого в программку нужно включить последующие предложения:

;Пример 3-7. Вывод на экран Goto... Search.. Hext Change.. Follou Previous 8 глава прямой записью в видеопамять ;В полях данных, адресуемых через DS . msg db 'Измерения окончены'

msg_len=S-msg ;В программном секторе mov SI,oflset msg AX,OB800h ES,AX DI,25*80*2 CX,msg_len

;Длина строчки

;О5:51->выводимая строчка

mov mov mov mov eld

;Сегментный адресок видеобуфера

; Будем адресовать через ES

;Смещение Goto... Search.. Hext Change.. Follou Previous 8 глава к последней строке экрана

;Счетчик цикла вывода знаков

;DF=0, движение по строке

;и по экрану вперед

mov AH,3 Ih

;Атрибут знаков — голубий по

; голубому

outscr:
lodsb

;Взятъ знак из строчки в AL

stosw

;Вывод на экран знака

;из AL и его атрибута из АН

;Цикл

loop outscr

Регистры DS:SI настраиваются на адресок начала выводимой строчки; ре­гистры ES:DI — на Goto... Search.. Hext Change.. Follou Previous 8 глава адресок требуемой позиции в видеобуфере. В регистр СХ нужно поместить длину строчки в б, а флаг DF скинуть, чтоб двигать­ся по строке вперед. На экран будет выводиться содержимое регистра АХ, в младшем б которого должен находиться код ASCII выводимого симво­ла, а в старшем б — атрибут знака, т.е Goto... Search.. Hext Change.. Follou Previous 8 глава. код цвета знака (в млад­шем полубайте) и код цвета фона (в старшем полубайте). В примере число 31h образует голубые знаки по бирюзовому фону. При желании можно избрать другую комбинацию цветов, выбрав ее при помощи табл. 3.1.

Таблица 3.1. Коды цветов стандартной палитры цветов

Код Цвет Код Цвет
Oh Темный 8U Сероватый Goto... Search.. Hext Change.. Follou Previous 8 глава
Ш Голубий 9U Голубой
2h Зеленоватый Ah Салатовый
3h Бирюзовый Bh Светло-бирюзовый
4h Красноватый Ch Розовый
5h Фиолетовый Dh Фиолетовый
6h Карий Eh Желтоватый
7h Белоснежный Fh Ярко-белый


Глава j


Команды и методы




Выбирая цвета, следует подразумевать, что при стандартной настройке видеосистемы, для цвета фона можно использовать только значения Goto... Search.. Hext Change.. Follou Previous 8 глава из ле­вого столбца таблицы; выбор хоть какого броского цвета из правого столбца приведет в выводу мерцающего знака. К примеру, атрибут знака Blh образует голубий мерцающий знак на бирюзовом фоне (а не голубий сим­вол на светло-бирюзовом фоне).

Содержательную часть цикла вывода образуют две команды lodsb и stosw Goto... Search.. Hext Change.. Follou Previous 8 глава. 1-ая команда загружает в регистр AL код еще одного знака, 2-ая выводит его вкупе с атрибутом, хранящемся в АН, на экран. При всем этом после каждого выполнения команды lodsb содержимое SI увеличи­вается микропроцессором на 1, смещая адресацию к последующему символу стро­ки; в то же время каждое выполнение команды Goto... Search.. Hext Change.. Follou Previous 8 глава stosw наращивает DI на 2 (так как команда stosw работает со словами), смещая адресацию на дисплее на 2 б, т.е. как раз к позиции последующего знака.

Примеры использования команд cmps и seas можно отыскать в Приложении.

3.4. Внедрение подпрограмм

Общая мысль использования подпрограмм явна: если в программке требуется неоднократно делать один и Goto... Search.. Hext Change.. Follou Previous 8 глава тот же кусок, его можно офор­мить в виде подпрограммы и вызвать при необходимости. Если под­программа не просит для собственного выполнения никаких характеристик и не должна возвращать в основную программку итог собственной работы, то дело ограничивается оформлением текста подпрограммы в виде процедуры, за­вершающейся командой ret, и вызовом Goto... Search.. Hext Change.. Follou Previous 8 глава этой процедуры при помощи ко­манды call. Как ранее говорилось ранее, подпрограмма может и не образовы­вать функцию, а быть просто частью основной программки. Принципиально только, чтоб у нее была входная метка, и чтоб она завершалась командой call.

В последующем примере подпрограмма delay употребляется для включе­ния в основной текст Goto... Search.. Hext Change.. Follou Previous 8 глава программки программных задержек фиксированной величины.

;Примср 3-8. Вызов code segment assume delay proc push CX mov CX,2000 dell: push CX mov CX,0 de!2: loop de!2 pop CX loop dell pop CX ret delay endp main proc

подпрограммы баз характеристик

cs: code, ds: data ;Процсдура-подпрограмма ;Сохраним СХ основной программки ;Счетчик Goto... Search.. Hext Change.. Follou Previous 8 глава наружного цикла ;Сохраним его ;Счетчик внутреннего цикла ;Внутрснний цикл (64К шагов) ;Восстановим наружный счетчик ;Наружный цикл (2000 шагов) восстановим СХ программки ;Возврат в программку


; Настроим DS ;на сектор данных ;Функция вывода на экран ;Адресок первой строчки ;Будем выводить строчки в цикле ;Вызов DOS ;Вызов подпрограммы задержки ;Прибавим к смещению длину строчки Goto... Search.. Hext Change.. Follou Previous 8 глава ;Цикл вызовов DOS ;3авершение программки

mov AX,data

mov DS,AX

mov AH,09h

mov DX,offset nisgl

mov CX,3 cntrl: hit 2 Hi

call delay

add DX,msg_len

loop cntrl

mov AX,4COOh

hit 21h main endp code ends data segment

msgl db "Процесс стартовал ",13,10,"$' msg_len=S-msgl

msg2 db "Процесс идет ",13,10,"$' msg3 db "Процесс заканчивается", 13,10,'$' data nds Goto... Search.. Hext Change.. Follou Previous 8 глава stk segment stack

dw 128 dup О stk ends

end main

В тексте программки поначалу описана процедура-подпрограмма, потом основная программка. Как ранее говорилось, порядок их описания роли не играет; принципиально только, чтоб в оканчивающей директиве окончания транс­ляции end был указан в качестве точки входа адресок основной программки (main в нашем примере Goto... Search.. Hext Change.. Follou Previous 8 глава).

Подпрограмма реализует задержку при помощи вложенных циклов с командой loop, использующей в качестве счетчика шагов регистр СХ. В ос­новной программке этот регистр употребляется для организации цикла выво­да 3-х строк. Потому 1-ое, что должна сделать подпрограмма — это сохранить содержимое регистра СХ, зачем естественно использовать стек. Перед оканчивающей Goto... Search.. Hext Change.. Follou Previous 8 глава командой ret регистр СХ должен быть восстановлен. Кусок, реализующий задержку, был описан ранее, в разделе 3.2.

Основная программка выводит на экран при помощи функции 09п три строчки текста. Для упрощения программки, также чтоб продемонстри­ровать некие приемы программирования, вывод строк реализован в цикле. Строчки изготовлены одной длины, и модификация смещения к очеред Goto... Search.. Hext Change.. Follou Previous 8 глава­ной строке производится прибаачением к содержимому регистра DX дли­ны строчки. Полезно направить внимание на компанию цикла в основной программке. В цикл, кроме команды вызова подпрограммы задержки и предложения, преобразующего регистр DX, включена только команда int 2lh. Регистр АН с номером функции поновой не настраивается. Это Goto... Search.. Hext Change.. Follou Previous 8 глава и не надо, потому что DOS, выполняя затребованную операцию, сперва


ы^Як.



Глава 3


сохраняет все регистры программки, а перед возвратом в программку их восстанавливает. Потому, вызывая функции DOS (либо BIOS) можно не хлопотать о сохранении регистров — их содержимое система на разруша­ет. Нужно только подразумевать, что многие функции DOS и BIOS Goto... Search.. Hext Change.. Follou Previous 8 глава после собственного окончания возвращают в программку некую информацию (чис­ло реально введенных знаков, доступный объем памяти, номер видео­режима и т.п.). Обычно эта информация ворачивается в регистре АХ, од­нако могут употребляться и другие регистры либо их сочетания. Потому, обращаясь в программке к системным функциям, нужно ознакомиться с их Goto... Search.. Hext Change.. Follou Previous 8 глава описанием и, а именно, поглядеть, какие регистры они могут использовать для возвращаемых значений.

Запустив программку, можно убедиться в том, что строчки текста появ­ляются на дисплее через приметные промежутки времени.

В примере 3-8 подпрограмма не добивалась характеристик. Почаще, но, подпрограмма должна принимать один либо несколько характеристик и воз Goto... Search.. Hext Change.. Follou Previous 8 глава­вращать итог. В данном случае нужно организовать взаимодействие основной программки и подпрограммы. Никаких особых средств языка для этого не существует; передачу характеристик в подпрограмму и из нее программер организует по собственному усмотрению. Для передачи характеристик как в одну, так и в другую сторону можно использовать регистры общего предназначения, ячейки Goto... Search.. Hext Change.. Follou Previous 8 глава памяти либо стек. К примеру, несложно конвертировать подпрограмму delay из примера 3-8 так, чтоб ей можно было передавать величину требуемой задержки. Пусть данная величина (в члсле шагов внешне­го цикла) передается в регистре SI.

;Пример 3-8а.Подпрограмма задержки с одним параметром,
передаваемом в регистре SI
delay proc ; Процедура - подпрограмма
push Goto... Search.. Hext Change.. Follou Previous 8 глава CX ;Сохраним СХ основной программки
mov CX,SI ;Счетчик наружного цикла
dell: push CX ;Сохраним его
mov cx,o ;Счетчик внутреннего цикла
de!2: loop de!2 ;Внутренний цикл (64К шагов)
pop CX ;Восстановим наружный счетчик
loop dell ;Наружный цикл (2000 шагов)
pop CX восстановим СХ программки
ret ;Возврат в программку

Можно пойти еще далее Goto... Search.. Hext Change.. Follou Previous 8 глава и составить подпрограмму таким макаром, чтоб передаваемый в нее параметр охарактеризовывал время задержки в се­кундах. Если не связываться с внедрением системного таймера в каче­стве инструмента для определения интервала времени, а как и раньше ре­ализовывать задержку при помощи процессорного цикла, ее величина будет зависеть Goto... Search.. Hext Change.. Follou Previous 8 глава от скорости работы определенного компьютера и должна быть подо­брана экспериментально. Приведенный ниже вариант подпрограммы пра­


уианды и методы



;Пример 3-86.Подпрограмма задержки с преобразованием

;параметра, передаваемого в регистре SI

delay proc ;Процедура-подпрограмма

push AX ;Сохраним все

push BX ;применяемые

push CX ;в подпрограмме

push DX ; регистры

mov AX,SI ;1-ый сомножитель в АХ

mov BX,600 ;2-ой экспериментально
;подобранный сомножитель

mul Goto... Search.. Hext Change.. Follou Previous 8 глава BX ;Произведение в DX:AX

mov СХ,АХ ;Нам оно необходимо в СХ

dell: push CX ;Сохраним его

mov CX,0 ;Счетчик внутреннего цикла

de!2: loop de!2 ;Внутренний цикл (64К шагов)

pop CX восстановим наружный счетчик

loop dell ;Наружный цикл (2000 шагов)

pop DX ;Восстановим

pop CX ;все сохраненные

pop BX ;сначала подпрограммы

pop AX ;регистры

ret ;Возврат в программку

Опыты проявили Goto... Search.. Hext Change.. Follou Previous 8 глава, что для получения правильной задержки значение параметра, обозначающее число секунд, следует множить на 600. Так как при умножении в системе команд МП 86 1-ый сомно­житель должен находиться в регистре АХ, а 2-ой не может быть непос­редственным значением и тоже, как следует, должен быть помещен в один из регистров Goto... Search.. Hext Change.. Follou Previous 8 глава, и, к тому же, произведение занимает два регистра DX:AX, приходится сохранять при входе в подпрограмм)' не один регистр, как в прошлом примере, а 4. Передаваемый в SI параметр переносится в АХ, в ВХ загружается 2-ой сомножитель, а из приобретенного с помо­щью команды mul произведения употребляется младшая часть Goto... Search.. Hext Change.. Follou Previous 8 глава, находяща­яся в АХ. Таким макаром, для данного варианта подпрограммы значение задержки не должно превосходить 109 с (109 х 600 = 65500, что практически совпа­дает с очень вероятным значением 65535).

Следует направить внимание на опасность, подстерегающую нас при выполнении операции умножения. Пусть значение передаваемого пара­метра состаштяет всего 5. При умножении на 600 получится число 3000, которое непременно помещается Goto... Search.. Hext Change.. Follou Previous 8 глава в регистре АХ. Но операция умноже­ния 16-разрядных операндов

mul BX

всегда, независимо от определенной величины произведения, помещает его в пару регистров DX:AX, и, как следует, при маленький величине Произведения регистр DX будет обнуляться. Потому, хотя мы и не ис-



Глава 3



пользуем старшую часть произведения и практически ее может и Goto... Search.. Hext Change.. Follou Previous 8 глава не быть, сохранение и следующее восстановление регистра DX является обяза­тельным.

Передача характеристик в подпрограмму через регистры общего назначе­ния либо даже через сегментные регистры полностью вероятна, но на практике для передачи характеристик в большинстве случаев употребляют стек, хотя бы поэтому, что регистров незначительно, а в стек можно Goto... Search.. Hext Change.. Follou Previous 8 глава поместить хоть какое число характеристик. При всем этом применяется типичная методика работы со сте­ком не при помощи команд push и pop, а при помощи команд mov с кос­венной адресацией через регистр ВР, который архитектурно предназна­чен конкретно для адресации к стеку. Преобразуем пример 3-86 так, чтоб единственный в этом примере Goto... Search.. Hext Change.. Follou Previous 8 глава параметр (условная величина задержки) передавался в подпрограмму не через регистр SI, а через стек. Вызов под­программы delay в данном случае должен производиться последующим образом:

push 2000 ;Проталкиваем в стек значение параметра

call delay ;Вызываем подпрограмму delay

Текст подпрограммы подвергнется значимым изменениям: ;Пример 3-8в. Передача параметра через стек

delay ргос Goto... Search.. Hext Change.. Follou Previous 8 глава
push CX
push BP
mov BP,SP
mov CX,[BP+6]
dell: push CX
mov cx,o
de!2: loop de!2
pop CX
loop dell
pop BP
pop CX
ret

;Процедура-подпрограмма

;Сохраним СХ основной программки

;Сохраним ВР

;Настроим ВР на текущую верхушку стека

;Скопируем из стека параметр

;Сохраним его ;,*•

;Счетчик внутреннего цикла }':';-

;Внутренний цикл (64К шагов Goto... Search.. Hext Change.. Follou Previous 8 глава) ;#

;Восстановим наружный счетчик i\-:

; Наружный цикл

восстановим ВР

;и СХ программки ||,_

;Возврат и снятие со стека \

;ненадобного уже параметра gj>;

Команда call, передавая управление подпрограмме, сохраняет в стеке адресок возврата в основную программку. Подпрограмма сохраняет в стеке еще два 16-разрядных регистра. В итоге стек оказывается в состоянии, изображенном на рис. 3.9.

После Goto... Search.. Hext Change.. Follou Previous 8 глава сохранения в стеке начального содержимого регистра ВР (в ос­новной программке нашего примера этот регистр не употребляется, но в общем случае это может быть и не так), в регистр ВР копируется содер­жимое указателя стека, после этого в ВР оказывается смещение верхушки стека. Дальше командой mov в регистр Goto... Search.. Hext Change.. Follou Previous 8 глава СХ заносится содержимое ячейки стека, на 6 байтов ниже текущей верхушки. В этом месте стека как раз находится передаваемый в подпрограмму параметр, как это показано в левом столбце рис. 3.9. Определенную величину смещения относительно вер­шины стека нужно для каждой подпрограммы определять персонально,


Команды и методы





ВР + 4 ВР + 6

SP


Рис. 3.9. Состояние стека в подпрограмме после Goto... Search.. Hext Change.. Follou Previous 8 глава сохранения регистров.

исходя из того, сколько слов сохранено ею в стеке к этому моменту. На­помним, что при использовании косвенной адресации с регистром ВР в качестве базисного, по дефлоту адресуется стек, что в этом случае и требуется.

Параметр, приобретенный таким макаром, употребляется дальше в подпрог­рамме точно так же, как Goto... Search.. Hext Change.. Follou Previous 8 глава и в примере 3-8а.

Выполнив возложенную на нее задачку, подпрограмма восстанавлива­ет сохраненные ранее регистры и производит возврат в основную про­грамму при помощи команды ret, в качестве аргумента которой указывает­ся число байтов, занимаемых в стеке отправленными туда перед вызовом подпрограммы параметрами. В нашем случае единственный параметр за Goto... Search.. Hext Change.. Follou Previous 8 глава­нимает 2 б. Если тут использовать обыденную команду ret без аргумен­та, то после возврата в основную программку' параметр остается в стеке, и его нужно будет оттуда извлекать (меж иным, не очень понятно, куда конкретно, ведь все регистры у нас могут быть заняты). Команда же с аргу­ментом, осуществив Goto... Search.. Hext Change.. Follou Previous 8 глава возврат в вызывающую программку, наращивает со­держимое указателя стека на значение ее аргумента, тем осуществ­ляя логическое снятие параметра. На физическом уровне этот параметр, как, впро­чем, и все другие данные, помещенные в стек, остается в стеке и будет затерт при дачьнейших воззваниях к стеку.

Очевидно, в Goto... Search.. Hext Change.. Follou Previous 8 глава стек можно было поместить не один, а сколько угодно характеристик. Тогда для их чтения было надо использовать несколько ко­манд mov со значениями смещения ВР+6, ВР+8, BP+OAh и т.д.

Рассмотренная методика может быть применена и при далеких вы­зовах подпрограмм, но в данном случае нужно учесть, что далекая Goto... Search.. Hext Change.. Follou Previous 8 глава команда call сохраняет в стеке не одно, а два слова, что воздействует на ^величину рассчитываемого смещения относительно верхушки стека.

3.5. Двоично-десятичные числа

В гл. 2 уже говорилось о двоично-десятичных числах — особом формате хранения данных, применяемом в ряде технических приложе-;-ний. Нередко эти числа именуют BCD-числами (от binary-coded decimal, 'двоично Goto... Search.. Hext Change.. Follou Previous 8 глава-кодированные десятичные числа). Для обработки BCD-чисел (сло-^жения, вычитания, умножения и деления) в МП 86 предусмотрены спе­циальные команды. Разглядим этот вопрос на всеохватывающем примере • обработки показаний КМОП-часов реального времени.


140_______________________________________________________________ Главаз

Как понятно, в современных компов имеются два независящих таймера. Какой-то из них («часы реального времени») включен Goto... Search.. Hext Change.. Follou Previous 8 глава в состав мик­росхемы с очень низким потреблением тока, питается от батарейки либо аккума, находящегося на системной плате, и работает даже на вык­люченной из сети машине. В этом таймере хранится и автоматом на­ращивается текущее календарное время (год, месяц, денек, час, минутка и секунда).

После включения компьютера Goto... Search.. Hext Change.. Follou Previous 8 глава вступает в работу другой таймер, кото­рый обычно именуют системным. Датчиком сигналов времени для него служит кварцевый генератор, работающий на частоте 1,19318 МГц; сиг­налы от которого, после пересчета в отношении 65536:1, поступают в контроллер прерываний и инициируют прерывания через вектор 8 с час­тотой 18,2065 Гц. Эти прерывания активизируют программку BIOS, перио­дически выполняющую инкремент Goto... Search.. Hext Change.. Follou Previous 8 глава содержимого четырехбайтовой ячейки памяти с текущим временем, находящейся по адресу 46Ch. После включе­ния машины программки BIOS считывают из часов реального времени текущее время суток, конвертируют его в число тактов системного таймера (т.е. в число интервалов по 1/18,2065 с) и записывают в ячейку текущего времени. Дальше Goto... Search.. Hext Change.. Follou Previous 8 глава содержимое этой ячейки нарастает уже системным таймером, работающим в режиме прерываний.

Для определения текущего времени прикладная программка может вызвать надлежащие функции прерывания 21h DOS (непосредственно, с номером 2Ah для получения даты и 2Ch для получения времени суток), а может прочесть время конкретно из часов реального времени при помощи прерывания lAli BIOS Goto... Search.. Hext Change.. Follou Previous 8 глава. При всем этом прерывание lAli позволяет, кроме чтения текущего времени (функция 02h) и текущей даты (функ­ция 04h), делать и целый ряд других функций, посреди которых мы отметим только возможность установить «будильник», т.е. записать в мик­росхему часов значение календарного времени, когда часы должны вы­дать сигнал аппаратного прерывания Goto... Search.. Hext Change.. Follou Previous 8 глава. Этот сигнал через вектор 70h ини­циирует обработчик прерываний, входящий в состав BIOS, который про­веряет, появилось ли данное прерывание в итоге заслуги времени установки будильника (часы реального времени могут инициировать пре­рывания и по других причинам), тестирует заодно батарейное питание микросхемы, а потом отправляет в оба Goto... Search.. Hext Change.. Follou Previous 8 глава контроллера прерываний команды конца прерываний и заканчивается командой iret. Но по ходу собственного выполнения обработчик прерывания 70U делает команду int 4Ah, которая передает управление на обработчик этого прерывания, тоже вхо­дящий в состав BIOS. Системный обработчик прерывания 4Ali ничего в особенности полезного не делает, в сути представляя собой просто про Goto... Search.. Hext Change.. Follou Previous 8 глава­грамму-заглушку. Но программер имеет возможность записать в век­тор 4Ali адресок прикладного обработчика прерываний, который будет ак­тивизироваться прерыванием будильника. Функции прикладного обработ­чика определяет программер.

В примере 3-9 устанавливается прикладной обработчик прерывания 4AU, который сам по для себя вызваться никогда не будет, потому что по умолча­нию Goto... Search.. Hext Change.. Follou Previous 8 глава будильник часов реального не работает. Если, но, прочесть си-


Команды и алгоритмы__________________________________________________ 141

схемное время при помощи функции 02U прерывания 1АИ, прибавить к нем>' некую величину, к примеру, 1 секунду, и установить будильник на это время {с помощью функции 06h прерывания lAli), то через секунду будет активизирован наш обработчик. В примере 3-9 этот Goto... Search.. Hext Change.. Follou Previous 8 глава процесс изготовлен нескончаемым: в обработчике прерываний будильника опять вы­полняется чтение времени,'прибавление к нему 1 секунды и установка будильника на новое время. В итоге наш обработчик будет вызываться каждую секунду до окончания всей программки.

Кроме служебной функции установки будильника на последующую секунду, обработчик прерываний делает и полезную работу Goto... Search.. Hext Change.. Follou Previous 8 глава: он выво­дит текущее время в конкретное место экрана. Так как обработчик активируется каждую секунду, выводимое значение времени будет об­новляться каждую секунду.

Как уже говорилось, в часах реального времени значение времени хранится в упакованных двоично-десятичных чисел. При выполнении ариф­метических операций с числами BCD (а нашем случае операции Goto... Search.. Hext Change.. Follou Previous 8 глава заключа­ются в прибаштении 1) нужно использовать созданные для этого команды микропроцессора. В примере проиллюстрировано внедрение одной из этих команд, непосредственно, команды daa.

Для того, чтоб вывести на экран значение времени, его нужно преоб­разовать в последовательность кодов ASCII. Процедура преобразования упакованных двоично-десятичных чисел в строчку знаков также вклю-в Goto... Search.. Hext Change.. Follou Previous 8 глава рассматриваемый пример. .

;Пример 3-9. Чтение и обработка показаний часов

;реального времени

.586 ;Будут употребляться дополнительные команды

assume CS:code,DS:data

code segment use!6

main proc

mov AX.data ;Настроим DS наш

mov DS,AX ;сектор данных

;Сохраним начальный вектор 4Ah

mov AX,354Ah

int 2 In

mov word ptr old_4a,BX

mov word ptr old_4a+2,ES ;Установим наш обработчик Goto... Search.. Hext Change.. Follou Previous 8 глава прерывания 4Ah

mov AX,254Ah

push DS ;Сохраним DS

push CS ;Настроим DS на сектор

pop DS ;команд

mov DX,offset new_4a;DS:DX->new_4a

int 21h

pop DS восстановим DS

;Установим будильник



Глава 3


mov int call mov
AH,02h lAli add_time AH,06h

;Чтение текущего времени

;Прибавим I секунду ;Установим будильник на это ; время Goto... Search.. Hext Change.. Follou Previous 8 глава int lAli ;Остановим программку, чтоб следить прерывания

mov AH.Olh ;Функция ввода с клавиатуры

int 2Ш ;3авершим программку, прибрав за собой

;Сброс будильника ;О5:ОХ=начальный вектор ;Установим начальный вектор ;Завершим программку

mov AH,07h

int lAli

Ids DX,old_4a

mov AX,254Ah

int 21h

mov AX,4COOh

int 21h
main endp

;Наш обработчик прерывания от будильника

new_4a Goto... Search.. Hext Change.. Follou Previous 8 глава proc

;Сохраним все регистры ;Сохраним к тому же ;сегментные регистры ;Настроим DS на наш ;сектор данных ;Прочитаем текущее время ;из часов реального времени ;Сохраним приобретенное ;тскущее время

pusha

push DS

push ES

mov AX,seg hour

mov DS,AX

mov AH,02h

hit lAli

push CX

push DX

;Преобразуем время из двоично-десятичных упакованных

;чисел в строчку знаков ASCII

mov AL,CH ;Перенесем Goto... Search.. Hext Change.. Follou Previous 8 глава часы в AL

call conv ;Преобразуем старшую цифру

mov hour,AH ;в ASCII и сохраним

and CH,OFh ;Вьщелим младшую цифру

add CH,'0' преобразуем в ASCII

mov hour+l.CH . ;и сохраним

mov AL,CL ;Перенесем минутки в AL

call conv ;Преобразуем старшую цифру

mov min,AH ;в ASCII и сохраним

and DL,OFh ;Выделим младшую цифру

add DL Goto... Search.. Hext Change.. Follou Previous 8 глава,'0' ;Преобразуем в ASCII

mov min+l,CL ;и сохраним

mov AL,DH ;Перенесем секунды в AL

call conv ;Преобразуем старшую цифру

mov sec,AH ;в ASCII и сохраним


и методы




and DH,OFh ;Выделим младшую цифру

add DH,"0' ;Преобразуем в ASCII :

mov sec+l,DH ;и сохраним

;Вьшедем сформированную строчку на экран

mov AX,OB800h ;Настроим ES на Goto... Search.. Hext Change.. Follou Previous 8 глава сектор

mov ES,AX видеопамяти

mov DI,160-16 ;Смещение к 72-му знакоместу

mov SI,offset 1юиг;О8:81->строчка с временем

mov CX,8 ;Цикл по 8 символам

mov AH,14h ;Атрибут красноватый по голубому

eld ;Движение вперед

screen: lodsb ;Очередной знак в AL

stosw ;Знак+атрибут на экран

loop screen ;Цикл

;Сбросим будильник и установим опять на время через 1с

mov AH,07h

hit Goto... Search.. Hext Change.. Follou Previous 8 глава lAh

; Вернем сохраненное в стеке ;текущее время ;Прибавим 1 секунду ;Установим будильник на ;время через 1 секунду восстановим сохраненные ;ранее сегментные регистры восстановим все регистры ; Выход из обработчика

pop DX

pop CX

call add_time

mov AH,06h

int 1AU

pop ES

pop DS

popa

iret

new_4a endp

;Подпрограмма добавления 1 секунды к текущему времени. ;Почти всегда довольно прирастить Goto... Search.. Hext Change.. Follou Previous 8 глава число секунд ;на 1, но в конце минутки нужно прирастить на 1 число минут, ;а в конце часа — прирастить на 1 число часов add_time proc ;Прибавим 1 к числу секунд

mov AL,DH ^Перенесем секунды в AL

call add_unit ;Прибавим I

mov DH,AL ;Перенесем вспять в DH

jnc ok ;Если CF=0, на выход

;CF=1, прибавим 1 к числу Goto... Search.. Hext Change.. Follou Previous 8 глава минут

mov AL,CL ;Перенесем минутки в AL

call add_umt ;Прибавим 1

mov CL.AL ;Перенесем вспять в CL

jnc ok ;Если CF=0, на выход

;Перенос, прибавим 1 к числу часов

mov AL,CH ;Перенесем часы в AL

call add_imit ;Прибавим 1

mov CH.AL ;Перенесем вспять в СН



Глава 3


ok: ret ' ;Выход из подпрограммы

add_time endp

Подпрограмма добавления Goto... Search.. Hext Change.. Follou Previous 8 глава 1 к двухразрядному BCD-числу,

Обозначающему 1 разряд времени (секунды, минутки либо

;часы)

;При вызове: AL — время в BCD (секунды, минутки либо часы)

;При возврате: AL — итог сложения в BCD

add_unit proc

add AL,1 ; Прибавим 1

daa ;Корректировка после сложения

cmp AL,60h ;Нужно ли корректировать

;последующий разряд времени'

jb done ;Нет, сумма < 60

mov Goto... Search.. Hext Change.. Follou Previous 8 глава AL,Oh ;Да, сумма=60, должно быть О

stc ;Установим CF, как признак

;переноса

jmp donel ;И на выход

done: clc ;Сбросим CF (переноса нет)

donel: ret ;Выход из прерывания

addjanit endp

; Подпрограмма преобразования старшей половины ;упакованного BCD-числа в регистре AL в код ASCII знака ;в регистре АН conv ргос

mov AH,0 ;Обнулим АН

- shl AX,4 ;Сдвиг старшего полубайта Goto... Search.. Hext Change.. Follou Previous 8 глава AL

;в АН

add АН,'0' ;Преобразуем в код ASCII

ret

conv endp code ends ;Сектор данных data segment usc!6


gotovie-esse-po-obshestvoznaniyu-ch-13.html
gotovie-esse-po-obshestvoznaniyu-ch-22.html
gotovie-esse-po-obshestvoznaniyu-ch-29.html