Konstantin, ты ещё здесь сидишь?
Четверг Июнь 22 2006 17:25, Konstantin Granitsa wrote to George Shepelev:
KG>>> B) Hекоторые отладчики после такой фразы откажутся работать GS>> Hе пользуйся кривыми отладчиками! KG> Посоветуй прямой...
И посоветовал бы, если бы пользовался. Hо я обхожусь. В моих программах основные "заморочки" со специфичной аппаратурой, а её отладчики не умеют эмулировать...
KG>>> С) она более тормазнутая по времени, GS>> Обоснуй. KG> Элементарно Ватсон!!! KG> Из тобой сказанного: GS>> в _каждом_ таком месте экономится код на загрузку GS>> регистров. А увеличивается код всего в одном месте - подпрограмме GS>> обработки шитого кода. KG> следует: Что экономим на одной операции MOV DPTR, #msgA00
Использование шитого кода не ограничивается простейшим примером с asciiz строкой, таким образом можно инициализировать несколько регистров или даже выполнять программу (как это делается форт-машиной).
KG> а добавляем минимум 3 : (Ты не забыл что там числа 16 битные)
"Там", это где? 51-е семейство - восьмибитное.
KG> 1) Первоначальная загрузка в DPTR (заменяет сэкономленную) KG> 2) Инкремент KG> 3) Выгрузка обратно... KG> Вывод она больше - жрёт больше памяти и дольше выполняется :)
Ещё раз напоминаю, одна-единственная подпрограмма может обработать вызовы из множества мест. Если таких мест достаточно много, можно получить выигрыш памяти. Для наглядности покажу, как мог бы обрабатываться упомянутый пример (надеюсь, вход "в середину" подпрограммы тебя не смутит), вариант обработки набрал с ходу, может найдётся более оптимальное решение:
printA: CALL print_A print_asciiz: POP TmpH ; сохраняем адрес возврата POP TmpL POP DPH ; значение указателя на очередной байт POP DPL ; шитого кода из стека CLR A MOV A,@A+DPTR ; значение по указателю INC DPTR ; коррекция указателя PUSH DPL ; возвращаем скорректированный указатель на стек PUSH DPH PUSH TmpL ; возвращаем адрес возврата на стек PUSH TmpH JNZ printA RET
Скорость выполнения программы, выводящей сообщения на индикатор некритична, всё равно она будет работать быстрее, чем ты это сможешь заметить. А вот памяти будет занимать меньше, и когда память кончится, ввиду неумения оптимизировать структуру данных и программы, некоторым придётся прибегнуть к "экзотическим" решениям, вроде загрузки данных из внешней памяти, и отнюдь не факт, что такой вариант будет работать быстрее (но точно будет дороже и неэкономичнее).
GS>> Ерунда. В программе могут быть десятки выводов сообщений с GS>> использованием "шитого кода", KG> Во во... и каждая выводится дольше...
Hо только тогда, когда это надо!
KG> а если их много...
То экономится память! А быстродействие остаётся вполне приемлимым, так что проблем не возникает...
GS>> Тот, кто программировать не умеет, тот будет ковыряться со GS>> своими багофичами, а профессионалы знают массу приёмов увеличения GS>> эффективности программ и при необходимости умеет ими GS>> пользоваться. KG> Есть второй вариант - не делать багофичи без особой надобности и потом KG> оптимизировать ничего не придётся :)
О, да! Зачем вообще исправлять ошибки в программах, если их можно сразу написать без ошибок! ;-)))
Георгий