"РЛ" - НАЧИНАЮ Щ ИМ
Единственное, о чем я жалею, так
это о том, что нет возможности узнать
ваши варианты решений ©. Придется
рассматривать мои, надеясь, что это-
го будет достаточно, чтобы вы смог-
ли разобраться со своими ошибками
(если они были, конечно), а также по-
няли некоторые общие подходы в про-
граммировании. Естественно, я просто
уверен, что проверить работу моих ва-
риантов вы прекрасно сумеете в
MCStudio!
Помните, что я рекомендовал преж-
де, чем браться за разработку, разоб-
раться сначала самому во всех дета-
лях? Так мы и поступим. Итак, задача
1. Представим себе, что речь идет о
заштриховке клеточек на бумаге, и сра-
зу в голове появляется алгоритм (т.е.
пошаговая инструкция)
ее решения:
штрихуем (заполняем) первую, опреде-
ляем место (т.е. адрес) следующей,
штрихуем ее, определяем место следу-
ющей и т.д., пока не заштрихуем (за-
полним) нужное количество. Теперь “пе-
реведем” зто на язык, понимаемый мик-
роконтроллером, т.е. подберем соответ-
ствующие команды. Разумеется, запол-
нение - это команда пересылки MOV.
Так как заносимое значение нам изве-
стно, используем команду пересылки
константы. Раз какие-то действия надо
повторять известное число раз - это не
что иное, как команда DJNZ. Адрес у
нас задан в регистре, а вычисление оче-
редного адреса - не что иное, как уве-
личение текущего на 1 - команда INC,
ведь область у нас непрерывная! Да, у
нас было требование, чтобы подпрог-
рамма возвращала неизменными зна-
чения всех регистров, поэтому перед
началом нашего алгоритма надо сохра-
нить (где? - разумеется, в стеке!), а пос-
ле завершения - восстановить все ис-
пользуемые нами регистры. Все, зада-
ча решена!
Небольшое отступление. Извес-
тен распространенный прием графи-
ческого оформления алгоритма рабо-
ты программы при помощи структур-
ных блоков или же в виде графа
со-
стояний.
На мой взгляд
- это
дело вку-
са, хотя при решении сложных задач
иной раз только графическое пред-
ставление и помогает. Вы сами выби-
райте для себя наиболее подходящий
способ, а я буду продолжать “действо-
вать, рассуждав.
Поясню нюансы. Каждая подпрог-
рамма имеет
точку входа -
первую
свою команду. Чтобы подпрограмму
можно было вызвать командой CALL
(я подменяю термин “псевдокоманда”
термином “команда”, т.к. в системе
MCStudio эти понятия практически не
различаются), мы должны знать
ад-
рес ее начала,
т.е. точки входа. Как
было ранее сказано, при написании
программ мы вместо адресов опери-
руем их символьными эквивалентами
- метками. Для метки подпрограммы
я выбрал вполне понятные английс-
кие слова, написанные слитно. Что-
бы одно слово не слилось с другим, я
выделил каждое заглавной буквой -
получилось красиво и понятно. Так ре-
комендую поступать и вам. Если у вас
проблема с английским - используй-
те транслитные эквиваленты русских
слов, например
O b n u le n ie P a m y a ti -
тоже вполне понятно, хотя не совсем
красиво. Использовать метки типа
М1
или
w e fg 2 3 d
не советую, так как
читаемость программы при этом рез-
ко ухудшается. Не бойтесь длинных
меток! Секунды, сэкономленные при
вводе метки, не окупят часы разби-
рательства в программе, написанной
месяц назад!
Завершаем подпрограмму, есте-
ственно, командой возврата RET.
Пояснять решение двух остальных
задач не стану, надеюсь, вы прекрас-
но разберетесь самостоятельно. Лишь
добавлю, что эти учебные примеры
взяты не “от фонаря” - необходимость
в решении таких
типовых
задач воз-
никает очень-очень часто при разра-
ботке реальных проектов, поэтому со-
ветую вам не терять удачные алго-
ритмические находки, они наверняка
пригодятся. И еще одно. Из приведен-
ных мною решений видно, что в каж-
дой подпрограмме больше всего ко-
манд тратится не на решение, а на со-
хранение и последующее восстанов-
ление регистров. Отсюда следует сде-
лать вывод, что это нерационально
(команд много - раз, PUSH и POP ис-
полняются 2 машинных такта, т.е.
медленно-два, используется область
стека, который “не резиновый” -три).
Обычно, столкнувшись с невозможно-
стью рационально решить поставлен-
ную задачу, следует.
.. изменить усло-
вие задачи! © Если снять требование
сохранять неизменными регистры, то
подпрограммы становятся крохотными
и максимально быстрыми, а значит,
именно это рационально. Но при этом
в момент вызова подпрограммы и пос-
ле него вы должны быть уверены, что
испорченные регистры не испортят
вам жизнь. Обычно учесть поведение
подпрограммы, если оно известно,
проще и рациональнее, нежели созда-
вать исключительно “чистые” подпрог-
раммы. Только в некоторых особых
случаях (о них речь впереди) действи-
тельно необходимо, чтобы подпрог-
рамма ничего не портила, а в осталь-
ных случаях это не требуется.
А теперь познакомимся с коман-
дами переходов. С одной из них - ко-
мандой SJMP вы уже знакомы, но она
не единственная.
В т а б л и ц е 1 0
по-
казаны все возможные варианты
этих команд.
В т а б л и ц е 1 0
вам встретится но-
вое обозначение операнда -
R E L .
Этот символ обозначает смещение в
пределах ±127 байт
относительно ад-
реса текущей команды.
Это значит,
что команда может передать управ-
ление команде, отстоящей от нее
максимум на 128 байт, причем как
вперед, так и назад. “Передать управ-
ление” - означает, собственно,
заг-
рузить в PC значение адреса коман-
ды.
Если используется операнд, обо-
значенный REL, то значение новое
PC вычисляется как сумма текущего
значения PC и значения REL, т.е. REL
может быть как положительным чис-
лом, так и отрицательным. Как все-
гда, вычислять значение адресов ко-
манд нам не нужно, эту задачу реша-
ет компилятор по расставленным
нами меткам.
Команды в строках 1
...3 - это ко-
манды
безусловной передачи управле-
ния, т.е.
переход на новый адрес про-
изводится всегда, в любом случае.
Вместо любой из этих команд вы мо-
жете использовать псевдокоманду
JM P ,
компилятор автоматически под-
ставит наиболее подходящую. Одна-
ко, не всегда такая подстановка мо-
жет быть наиболее оптимальной - ко-
манды SJMP и AJMP занимают в па-
мяти 2 байта, a LJMP - 3, но компи-
лятор автоматически не всегда мо-
жет подставить наиболее короткую,
поэтому если у вас дело дойдет до
Радиолюбитель - 0 6 /2 0 0 7 [|
37
предыдущая страница 37 Радиолюбитель 2007-06 читать онлайн следующая страница 39 Радиолюбитель 2007-06 читать онлайн Домой Выключить/включить текст