і
МИКРОКОНТРОЛЛЕРЫ
і
2. Далее (начиная с метки again) в
программе появляется две странных
команды
mial
и
miah,
описания кото-
рых нет в системе команд процессо-
ра. Это - на самом деле команды
movl,
и записывают они в ячейки
%а1
и
%а2
адрес команды
jmp cond_0,
по-
меченный в программе меткой label.
Адрес команды, помеченной меткой
label, можно было бы подсчитать и
вручную (посмотреть, за сколько ко-
манд она расположена от начала про-
граммы), а затем занести в ячейку
%а1
младший байт подсчитанного
адреса, а в ячейку
%а2
- старший
байт адреса (напоминаем читателю,
что все адреса команд программы
занимают два байта, потому что ем-
кость памяти программ - 1024 сло-
ва, а в одном байте можно предста-
вить число величиной не более 255),
но компилятор tessa избавляет про-
граммиста от такой дурной работы:
он сам подсчитает адрес команды,
помеченной меткой label, и заменит
команду
mial
на команду
movl
с
младшим байтом адреса, а команды
miah
- на команду
movl
со старшим
байтом адреса. Итак, в результате
выполнения команд
mial
и
miah
в
ячейках
%а1
и
%а2
окажется адрес
команды, помеченной меткой label.
3. Далее следуют команды сложе-
ния только что загруженного адреса
команды с номером текущего состо-
яния автомата. Обратите внимание
- здесь нам впервые приш лось
столкнуться с выполнением арифме-
тических операций над
многобайт-
ными
числами. Для сложения мно-
гобайтных чисел существует общее
правило - сначала сложить с помо-
щью команды
add
младшие байты
двух чисел (в данном случае с млад-
шим байтом адреса команды, поме-
ченной меткой label, находящимся в
ячейке
%а1
, складывается номер те-
кущего состояния автомата, находя-
щийся в ячейке
%а0),
а затем с по-
мощью команды
adc
распространить
флаг переноса на все остальные бай-
ты многобайтного числа (вспомните
- аналогичным образом устроены
все многодекадные счетчики: в них
сигнал переноса от младшего счет-
чика подключен ко входу следующе-
го, более старшего счетчика). Таким
образом, после выполнения команд
add
и
adc
в ячейках
%а1
и
%а2
ока-
жется новый адрес: если текущее
состояние автомата было нулевым -
зто по-прежнему будет адрес все той
же команды, помеченный меткой
label, если текущее состояние было
равно единице - это будет адрес сле-
дующей за ней команды
jmp cond_1,
если состояние было равно двойке -
адрес команды
jmp cond_2
и т.д.
4.
И, наконец, вычисленный таким
образом адрес загружается в регистр
косвенной адресации IR1 (напомина-
ем читателю - этот регистр образует
регистровая пара, состоящая из ре-
гистров #6 и #7), причем младший
байт адреса загружается в регистр
#6, а старший - в регистр #7. Дела-
ется зто с помощью команд
mtpr.
Далее следует команда косвенного
перехода
ijmp,
которой радиолюби-
тели пользуются чрезвычайно ред-
ко. Между тем это очень полезная
команда - она позволяет переда-
вать управление в то место про-
граммы, которое не известно зара-
нее, а вычисляется в процессе ра-
боты программы, как зто только что
проделали мы. Передача управле-
ния при этом производится по тому
адресу, который находится в регис-
тре IR1: для случая, когда состоя-
ние автомата равно нулю, это будет
адрес команды, помеченной меткой
label, для случая, когда состояние
автомата равно единице - адрес
следующей команды
jmp cond_1,
для состояния, равного двойке -
адрес команды
jmp cond_2
и т.д.
Такая конструкция носит в про-
грам м истской литературе назва-
ние
вычисляемого перехода
или
вычисляемого goto
(именно так -
goto,
- обозначается оператор пе-
рехода в языках высокого уровня).
После выполнения команды
ijmp
управление будет передано соот-
ветствующей команде из списка,
помеченного меткой label, а уж та
команда передаст управление на
соответствующий участок програм-
мы, обрабатывающий одно из четы-
рех состояний автомата.
Теперь реализуем обработку состояний автомата:
< 1 > Н ажата ли кн о п ка "торш ера"
(л о г.О )
< 2 > П ока н е т —
н а ч а ть р а б о ту ав то м ата с н а ч а л а .
< 3 > Теперь новое со сто ян и е ав то м ата = 1
< 4> Включить л ам по чку.
Отпущ ена ли кн о п ка "торш ера"
(л о г .1 )
П ока н е т —
н ач а ть р а б о ту ав то м ата с н а ч а л а .
Теперь новое со сто ян и е ав то м ата = 2
Н аж ата ли кн о п ка "торш ера"
(л о г.О )
П ока н е т - н ач а ть р а б о ту а в то м ата с н а ч а л а .
Теперь новое со сто ян и е а в то м ата = 3
О тклю чить л а м п о ч ку .
Отпущ ена ли кн о п ка "торш ера"
(л о г .1 )
П ока н е т —
н ач а ть р а б о ту ав то м ата с н а ч а л а .
Теперь новое со сто ян и е ав то м ата = 0
cond 0:
b t t l
% b l,0 0 0 0 0 0 0 1 b
jn z
a g a in
m ovl
% a0,1
b i s l
%b2, 0 0 0 0 0 0 0 1 b
jmp
a g a in
c o n d _ l:
b t t l
% b l,0 0 0 0 0 0 0 1 b
jz
a g a in
m ovl
% a0,2
jmp
a g a in
cond_2:
b t t l
% b l,0 0 0 0 0 0 0 1 b
jn z
a g a in
m ovl
% a0,3
b i d
% b 2 ,0 0 0 0 0 0 0 1 b
jmp
a g a in
oond_3:
b t t l
% b l,0 0 0 0 0 0 0 1 b
j z
a g a in
m ovl
% a0,0
jmp
. end
a g a in
Е З
Продолжение в №9/2005
Радиолюбитель - 0 8 /2 0 0 5 |
I « I
предыдущая страница 47 Радиолюбитель 2005-08 читать онлайн следующая страница 49 Радиолюбитель 2005-08 читать онлайн Домой Выключить/включить текст