fl
"РЛ" - НАЧИНАЮЩИМ
(f
вполне элегантное решение. Но можно использо-
вать и следующий способ:
Не правда ли, оригинально? Никакой явной пере-
дачи параметров в подпрограмму, и вообще кажется,
Output:
CALL
Output
что после возврата из Output вместо команды будет
DB
'Строка 1' , 0
выполняться какая-то белиберда, получившаяся из
CALL
Output
текста строки.
.. Так и было бы, если бы подпрограм-
DB
'Строка 2 ' , 0
ма не использовала описанный ранее финт:
; вывод с переподвыподвертом
©
pop
DPH
7 извлекаем адрес строки
pop
DPL
loop:
clr
A
move
A, 0A+DPTR
r
получаем очередной символ
inc
DPTR
/ сразу вычисляем адрес след.символа
jz
exit_output
7 если загр.символ=0, то выходим
; тут выводим очередной символ строки на устройство отображения
jmp
output_loop
exit_output:
jmp
@A+DPTR
выход из подпрограммы
Вот какие трюки тут использованы: во-первых, ад-
рес начала строки извлекается из стека (а что же еще
там может быть, ведь на месте команды после CALL
находится строка, вот ее адрес и попадает в стек при
выполнении CALL), а во-вторых, выход из подпрограм-
мы осуществляется путем перехода на адрес, который
следует за последним символом строки, т.е. нулем - а
это как раз адрес следующей нормальной команды. При
этом аккумулятор у нас уже содержит 0, что необходи-
мо для правильного выполнения команды JMP
©A+DPTR. Такой подход очень удобно применять в ком-
плексе с макросом вывода, например таким:
MACRO
String
CALL
output
DB
String, 0
ENDM
С использованием этого макроса наш пример с вы-
водом пары строк запишется совсем красиво, почти как
на языке высокого уровня (например, бейсике ©):
Print
'Строка 1'
Print
'Строка 2'
В чем прелесть этого примера? Ну, во-первых, это
красиво и оригинально ©, во-вторых, если у вас в про-
грамме имеется необходимость вывода нескольких де-
сятков строк, то экономия памяти за счет команд MOV
DPTR, #StrXXX может оказаться существенной, в-тре-
тьих, при использовании макросов читаемость текста
программы значительно повышается, так как вы ис-
пользуете интуитивно понятную запись PRINT ‘стро-
ка’ для вывода любой строки. Разумеется, подобный
подход можно применять и для передачи иной инфор-
мации в подпрограммы.
Еще одним очень полезным приемом в программи-
ровании может стать организация
табличных перехо-
дов
и
табличных вычислений.
Вам знакома команда
JMP ©A+DPTR, которая помимо вычисляемого адреса
перехода позволяет организовать переход по таблице
адресов. Когда это может потребоваться? Ну, самый
простой пример - работа с клавиатурой.
Обычно в программах с использованием клавиату-
ры используется следующий обобщенный алгоритм:
1. Осуществляется инициализация всех перемен-
ных, запуск фоновых процессов и т.п., в том числе не-
кой переменной, назовем ее Mode, определяющей те-
кущий режим работы устройства.
2. На устройство индикации выводится информация,
соответствующая текущему значению Mode.
3. Происходит опрос клавиатуры. Обычно для хра-
нения номера нажатой клавиши так же используется
определенная переменная, пусть это будет Key.
4. Если Кеу=0, значит ни одна кнопка не нажата. В
этом случае программа выполняет одну из фоновых за-
дач. Очень часто все необходимые фоновые задачи вы-
полняются по прерываниям, и тогда программа просто
переходит к шагу 3, ничего более не делая.
5. Если Key не равно нулю, то это код нажатой кноп-
ки. В зависимости от значения Mode выполняется не-
обходимая обработка нажатия клавиши, как правило,
отдельной подпрограммой. В ходе обработки может из-
мениться значение Mode.
6. Переход к шагу 2.
Как видите, алгоритм представляет собой бесконеч-
ный цикл, в котором непрерывно опрашивавтся клави-
атура и периодически обновляется информация на ус-
тройстве отображения. Легко догадаться, что если ре-
жимов несколько, то для каждого из них потребуется
своя процедура вывода информации, а также свои про-
цедуры обработки нажатий одних и тех же кнопок (на-
пример, кнопка “+” в одном режиме может увеличивать
значение какого-либо числа, а в другом режиме - пе-
ремещать курсор по дисплею). Как вы уже догадывае-
тесь, наибольшую сложность при реализации алгорит-
ма будет представлять именно анализ кодов режима и
нажатой кнопки.
Радиолюбитель - 0 3 /2 0 0 8 U
41
предыдущая страница 41 Радиолюбитель 2008-03 читать онлайн следующая страница 43 Радиолюбитель 2008-03 читать онлайн Домой Выключить/включить текст