Раздел: Документация
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
-© Через каждые 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
|