8(495)909-90-01
8(964)644-46-00
pro@sio.su
Главная
Системы видеонаблюдения
Охранная сигнализация
Пожарная сигнализация
Система пожаротушения
Система контроля удаленного доступа
Оповещение и эвакуация
Контроль периметра
Система домофонии
Парковочные системы
Проектирование слаботочных сетей
Аварийный
контроль
Раздел: Документация

0 ... 19 20 21 22 23 24 25 ... 39

Если в сдвоенный регистр загружено число 5000Н, время выполнения подпрограммы равно 0.2 с.

Вызов подпрограммы задержки из главной программы производится с помощью оператора «CALL DELAY», где DELAY - это метка языка ассемблера, представляющая собой адрес первой команды этой подпрограммы, заданный в виде символической константы. При трансляции операторов языка ассемблера в коды машинных команд устанавливается числовое значение адреса, соответствующее данной символической константе.

Компоновка единой программы

Итак, мы составили программы для решения отдельных задач (определение состояния контактов переключателя, последовательное включение светодиодов с их последующим одновременным выключением, задержка момента включения очередной пары светодиодов).

Теперь объединим эти программы в единое целое. При этом следует обратить особое внимание на то, как изменяется содержимое регистров, используемых в нескольких программах. Например, во всех программах используется регистр А. Если при объединении программ содержимое регистра А в каждом конкретном случае будет отличается от того, каким оно было при раздельном выполнении данной части программы, то программа будет работать неправильно. Поэтому, перед тем как содержимое регистра А будет изменено другой программой, необходимо «спрятать» текущее значение в другом регистре. Объединенная программа, составленная с учетом этого обстоятельства, приведена на Рис. 7.6.

В процедуру последовательного включения диодов введен оператор CALL, вызывающий подпрограмму задержки. При возвращении из подпрограммы задержки содержимое регистра А всегда равно 0. Поэтому на время выполнения подпрограммы содержимое регистра А записывается в регистр В. Запись содержимого регистра А в регистр В перед командой вызова подпрограммы, а также считывание оттуда сохраненного значения этого числа обратно в регистр А после выполнения подпрограммы осуществляется посредством оператора загрузки LD.

Первая команда программы «LD SP 1000Н» устанавливает начальное значение указателя стека 1000Н, тем самым указывая область сте-

Згооцедуры-1.2 п3объедипяемв однупрограмму]

LD SP, 1000Н LOOP1: IN А,(0А0Н) AND 01Н JP Z, LOOP1 XOR A LOOP2: ADD A, A INC A OUT (0A1H),A LD B,A CALL DELAY LD А, В CP JP

XOR OUT JP

DELAY: LD LOOP3: DEC

LD

OR

JP

RET

Указатель стека загружается в ячейку ОЗУ с адресом, равным последнему адресу программы +JJ

Ждем замыкания контактов переключателя

OFFH NZ, LOOP2 А

(ОАШ), А LOOP1 HL, 8000Н HL А, Н L

NZ, LOOP3

г Содержимое регистра А «прячем»

в регистре В

\ --

гВызываем подпрограмму задержки

1 Содержимое регистра В возвращаем в регистр л ]

Через каждые 0.3 с зажигается очередная j пара светоиодов. После того как загорелись все диоды, происходит их одновременное выключение

Чтобы определить состояние контактов, переходим на метку LOOP1

Считаем до 32768, чтобы «убить» время

Рис. 7.6. Объединенная программа выполнения задачи № 1

ка (см. Рис. 6.8). Хотя это не имеет явного отношения к выполняемой

задаче, указывать область стека в начале программы необходимо. Программа в машинных кодах и на языке ассемблера Если сравнить тексты программы, записанной на ассемблере и в

Машинных кодах (Рис. 7.7) начиная с адреса 0000Н, можно заметить

некоторые различия.


Начальные адреса] программы

[ Программа в мнемокодах}

Адреса

0000

0003

0005

0007

000А

000В

000С

000D

000F

0010

0013

0014

0016

0019

001А

001С

001F

0022

0023

0024

0025

0028

Программа в машинных кодах

ORG ООООН PORT1 EQU 0A0H PORT2 EQU 0А1Н

Директивы

31 00 10

DB АО

Е6 01

СА 03 00

AF

87

ЗС

D3 А1 47

CD IF 00 78

FE FF C2 OB 00 AF

D3 Al

C3 03 00

21 00 80

2B

7C

B5

C2 22 00 C9

LD

LOOP1: IN AND JP

XOR

LOOP2: ADD INC OUT LD CALL LD CP JP

XOR OUT JP

DELAY: LD LOOP3: DEC LD OR JP RET

SP, 1000H A, (PORT1) 01H

Z, LOOP1 A

A,A A

(PORT2), A

B,A DELAY А, В OFFH NZ, LOOP2 A

(PORT2),A LOOP1 HL, 8000H HL A, L L

NZ, LOOP3

Jv

END Директива

В каждой строке программы в области, заключенной в рамку, команда в машинных кодахоотеттвует команде в мнемокодах

Рис. 7.7. Программа в машинных кодах и на языке ассемблера

Действительно, в программе, записанной в машинных кодах, в некоторых строках отсутствуют команды, соответствующие операторам языка ассемблера. Речь идет о трех первых (команды ORG и EQU) и о последней (команда END) строчках программы. Эти команды, называемые «директивами», объявляют начало программы. Поскольку они не имеют «двойников» в машинных кодах, то они и не выполняются.

Директива ORG (сокр. от англ. Origin) объявляет адрес первой команды - в соответствии с этой командой программа будет последовательно загружаться начиная с адреса ООООН. Следовательно, первая команда программы «LD SP 1000Н» (машинный код - 31 00 10) загружается начиная с адреса ООООН. Загрузка первой команды происходит следующим образом: сначала по адресу ООООН загружается код ЗШ, затем по адресу 0001Н - код ООН, наконец, по адресу 0002Н - код ЮН.

Директива EQU (сокр. от англ. Equate) объявляет числовое значение какой-либо символической константы, используемой в программе. В нашей программе это константы PORT1 и PORT2. В частности, команда «P0RT1 EQU ОАОН» означает, что идентификатору PORT1 ставится в соответствие числовая константа (код) ОАОН.

Таким образом, с помощью директивы EQU можно присвоить какому-либо идентификатору числовое значение и использовать в программе этот идентификатор вместо записи соответствующего числового значения. Такая замена упрощает работу с программой, так как вместо «отвлеченного» числа программист получает возможность оперировать обозначениями, в которые он вкладывает вполне понятный для него смысл.

Директива END на языке ассемблера объявляет конец программы. В программе, представленной на Рис. 7.7, метки «LOOPl», «LOOP2», «DELAY», «ЬООРЗ» представляют собой символические адреса. Как вы уже хорошо знаете, при трансляции программы на язык машинных команд символьные обозначения заменяются на соответствующие им числовые значения. Так, команда «LOOPl: IN A, (PORTl)» находится по i адресу 0003Н. Это означает, что метка LOOP1


используется в программе в качестве символического адреса, соответствующего числовому адресу 0003Н. Следовательно, запись «JP Z, LOOPl» в данном случае эквивалентна записи «JP 2, 0003Н». При трансляции в машинные коды символьное обозначение метки адреса LOOP1 преобразуется в числовой код 0003Н.

Таблица соответствия адресов, представленных символическими константами, используемыми в данной программе, числовым адресам приведена на Рис. 7.8. Сравнив обе программы (см. Рис. 7.7), легко убедиться в том, что таблица составлена правильно.

Метка (символический адрес) I

Символический адрес на ассемблере -При трансляции

это «зашифрованный» с помощь буквкоманды в машинные

числовой адрес команды в машинныхкоды метка

[ кодах J[преобразуется в число

LOOP1.........Адрес команды INгг> 0003Н

LOOP2.........Адрес команды ADD000BH

DELAY.........Адрес команды «LD HL»сф> 001FH

LOOP3.........Адрес команды DEC0022Н

Рис. 7.8. Соответствие меток, используемых в программе, числовым адресам

Мы знаем, что при выполнении программы компилятор языка ассемблера последовательно «переводит» команды на язык машинных кодов. Таким образом, программы, приведенные справа и слева на Рис. 7.7, - это соответственно исходный текст и перевод задания, которое программист составил для микрокомпьютера.

Если бы не было компилятора языка ассемблера, нам пришлось бы самим выполнять функции «переводчика», каждый раз обращаясь к списку команд, приведенному в Приложении 2, чтобы «объяснить» микрокомпьютеру смысл очередной строчки.

Например, переведем в машинные коды команду «JP Z, LOOPb-Из списка команд следует, что оператору «JP Z, lm» соответствует машинный код «СА т I». Затем, преобразовав символический адрес LOOP1 в 0003Н и установив соответствие: / = 00, т = 03, получим полный код машинной команды: «СА 03 00». При этом мы должны

7.3. Задача № 2

быть предельно внимательными, чтобы не перепутать порядок старших и младших байтов (/ и т) 2-байтовой константы адреса (на языке машинных команд он обратный!).

Составленная нами программа размещается в памяти микропроцессора, начиная с адреса 0000Н по адрес 0028Н, то есть занимает 41 (28Н + 1) байт.

7.3.

,ЗАДАЧА № 2 - ЗАПОМНИТЬ ПОСЛЕДОВАТЕЛЬНОСТЬ АКТИВИЗАЦИИ СИГНАЛОВ И ВОСПРОИЗВЕСТИ ЕЕ (ВАРИАНТ 1)

В этом разделе рассмотрим следующую задачу.

Сначала, чтобы уточнить задачу, обратимся к схеме подключения входных и выходных устройств к портам микрокомпьютера (Рис. 7.9), например выключателей и реле.

- Задача№2-

Сигналы подаются с помощью 6 выключателей, подключенных к порту ввода. Последовательность подачи сигналов с контактов выключателей из порта ввода заносится в память. Через порт вывода контакты шести реле в той же последовательности воспроизводят сигналы контактов выключателей. При воспроизведении сигналов осуществляется задержка (приблизительно 0.5 сек) между командами замыкания реле. Начало и окончание записи сигналов задаются посредством отдельных выключателей.>

На схеме показано 6 выключателей PSb-.PS подключенных соответственно ко входам Ii...Lj и задающих последовательность сигналов, которую предстоит запомнить микрокомпьютеру. Момент начала записи последовательности сигналов определяется состоянием контактов выключателя SW0, соединенного с выводом 10, порта ввода. Окончание записи сигналов и начало их воспроизведения микрокомпьютер будет определять по состоянию контактов выключателя SW7 в цепи входа 17 порта ввода. При замыкании контактов этого переключателя прекращается запись сигналов, а при раз-Мыкании начинается их воспроизведение.

Воспроизведение записанной последовательности сигналов будет осуществляться путем замыкания контактов шести реле, под-

153

152



0 ... 19 20 21 22 23 24 25 ... 39