i
МИКРОКОНТРОЛЛЕРЫ
I
Объем программы, по сравне-
нию со switch-технологией, конеч-
но, впечатляет. Итак, комментарии
по программе:
1. В программе снова употреб-
лены команды
Idal
и
Idah,
которых
нет в описании системы команд
микроконтроллера. Это - на самом
деле команды
Idr,
и они, по анало-
гии с командами
mial
и
miah,
тоже
загружают в регистры адрес, отме-
ченны й м е тко й ta b le . Р азни ца
здесь в том, что команды
mial
и
miah
(есть такж е команды
lial
и
liah)
загружаю т адрес, выражен-
ный в
словах,
тогда как команды
Idal
и
Idah
(есть такж е команды
mdal
и
mdah)
загруж аю т адрес,
выраженный в
байтах:
напомним
читателю, что микроконтроллер со-
держит память программ объемом
1024 слова, а поскольку слово со-
стоит из двух подряд идущих байт,
то объем памяти программ - 2048
байт. В отличие от команд, к кото-
рым процессор обращается по сло-
вам, при обращении к памяти про-
грамм через регистр IR1 можно
получить доступ индивидуально к
каждому байту, поэтому для рабо-
ты с ним и используются команды
Idal
и
Idah.
Можно очень грубо счи-
тать, что команды
Idal
и
Idah
за г-
рузят в регистр IR1 число, вдвое
большее, чем это сделали бы ко-
манды
lial
и
liah.
2. Команда
mov %a3,%d7
- пер-
вый случай употребления в про-
грамме косвенного регистра IR1 и
косвенной адресации. Она пересы-
лает в ячейку
%аЗ
байт, отмечен-
ный меткой table (в нем находится
число строк таблицы автомата),
т.к. мы только что загрузили ре-
гистр IR1 адресом именно этой
метки. Обратите внимание на ав-
томатную таблицу: в ней отмечена
меткой table конструкция
.byte.
С
помощью этой конструкции в памя-
ти программ можно разместить не
команду, а именно желаемое зна-
чение. В данном случае мы зано-
сим в очередной байт (не слово!)
памяти программ число 4 (оно бу-
дет размером 1 байт). Для занесе-
ния в память программ чисел, за-
нимающих два байта (например,
для м еток) используется другая
46 |-------------------------------------------
конструкция -
.word.
Именно с по-
мощью конструкций
.byte
и
.word
заносятся в память программ все
данные (например, тексты сообще-
ний, которые необходимо выдать
на экран Ж КИ). Вместо команды
mov
в принципе можно было бы в
данном случае просто воспользо-
ваться командой
movl %аЗ,4,
но ко-
манда
mov %a3,%d7
- более пра-
вильное решение (почему - будет
понятно несколько позже). Напом-
ним читателю, что при употребле-
нии в команде конструкции
%d7
со-
держимое регистра IR1 после вы-
полнения команды автоматически
будет увеличено на единицу(пото-
му что он указывает на память про-
грамм, а для нее предусмотрен ре-
жим
автоинкремента,
т.е. автома-
тического увеличения содержимо-
го регистра IR1 на единицу), т.е. он
“с д в и н е тся ” на начало первой
строчки автоматной таблицы.
3.
Команда
стр
сравнивает те-
кущ ее состояние автомата с тем,
которое записан о в очередной
строчке таблицы. Хочется сразу же
предупредить читателя -
ни в коем
случае
нельзя записывать эту ко-
манду в виде
cmp %d7,%a0.
Свя-
зано это с особенностью реализа-
ции
ядра
м и кр о ко н тр о л л е р а
КР1878ВЕ1, и, к великому сожале-
нию, никак не отражено в докумен-
тации по нему:
если регистр IR1
ссылается на память программ,
его ни в коем случае нельзя ука-
зывать в качестве “приемника”
данных в какой-либо команде!
Несмотря на то,
что команда срав-
нения
ничего никуда не записы-
вает
(кроме флагов регистра со-
стояния),
на нее зто правило тоже
распространяется!
Если состоя-
ние автомата - “не то”, следующая
команда
jnz
обеспечит переход на
новую строчку таблицы автомата.
Посмотрите на участок программы,
отмеченный меткой $1: там распо-
ложена “странная” последователь-
ность из пяти команд сравнения
cmpl.
Этот, на первый взгляд, бес-
смысленный код, нужен только для
того, чтобы просто передвинуть ре-
гистр IR1 на начало новой строчки
таблицы - а для этого он должен
сдвинуться на 5 байт (одна строчка
автоматной таблицы имеет размер
6 байт, - поле
.byte
размером 1
байт, поле
.word
размером 2 бай-
та, далее - еще одна такая же “па-
р о чка ” , а на один байт по этой
строчке мы уж е сдвинулись при
выполнении команды
стр,
так что
о стается сд ви нуться ещ е на 5
байт). Каждая команда, в которой
употреблена конструкци я
%d7,
сдвигает регистр IR1 на 1 байт, по-
этому и требуется пять команд, в
которых употреблена конструкция
%d7.
Ни для чего иного эти коман-
ды не предназначены, поэтому в
качестве команд и выбраны наибо-
лее “безобидные” команды
cmpl,
которые ничего, кроме регистра со-
стояния, не портят.
4.
Далее следуют команды
mov
%a1 ,%d7
и mov
%a2,%d7,
которые
переписываю т в рабочие ячейки
адрес подпрограммы анализа тер-
минального символа - для указа-
ния адреса д остаточн о просто
употребить в конструкции
.word
со-
ответствую щ ую метку. О тметим
сразу же, что после их выполнения
регистр IR1 сдвинется на 2 байта,
т.е. “доберется” в текущей строчке
таблицы до байта с номером ново-
го состояния автомата.
Далее в программе нам встре-
тились новые, ранее не применяв-
шиеся команды
push.
Что это за
команды и для чего они применя-
ются? Чтобы ответить на этот воп-
рос, придется вернуться немного
назад - к той статье, в которой опи-
сывалось общее устройство микро-
контроллера КР 1878В Е1, и где
было сказано, в частности, о том,
что в микроконтроллере существу-
ют две специальные сущ ности -
стек команд и стек данных. Теперь
настало время рассмотреть их под-
робнее.
Стек данных предназначен для
врем енного хранения регистров
(#А, #В, #С, #D, #4, #5, #6, #7),
со-
держимое которых вы не хотите по-
терять или испортить. Именно та-
кая ситуация сейчас и сложилась
в нашей программе - для того, что-
бы выполнить команду
ijsr
(о ней
мы расскажем немного попозже),
нам потребуется загрузить в косвен-
ный регистр IR1 адрес вызываемой
| Радиолюбитель - 0 9 /2 0 0 5
предыдущая страница 44 Радиолюбитель 2005-09 читать онлайн следующая страница 46 Радиолюбитель 2005-09 читать онлайн Домой Выключить/включить текст