Hello Maxim,
MP>>> Hу на то он и пример ;) Hасколько ты понимаешь мне не составит MP>>> труда накатать алгоритм для которого мне с лихвой хватит набора из MP>>> 8 текущих регистров
AM>> Я тебе уже один раз писал, ты проигнорировал письмо. Я повторюсь. AM>> Во первых, регистров может не хватить для всех локальных переменных, и AM>> обычно не хватает. MP> Вот глобальные различия - мне обычно хватает.
8 регистров х51 для всех вложений ? И сколько у тебя их, вложений? 2? Тогда понятно.
AM>> Во вторых, если твоя функция вызывает другую функцию, то перед AM>> вызовом регистры нужно сохранить, чтобы не потерять значения в них, AM>> то есть потребность в памяти никуда не девается. MP> Зачем сохранять - не нужно сохранять.
Переменные могут понадобиться и после вызова функции.
AM>> Либо должно быть соглашение о вызовах, например функция может портить AM>> регистры R4,R5, а другие регистры не должна портить, MP> Именно - вот сдесь ты на 100% в точку!
AM>> что эквивалентно либо необходимости сохранения/восстановления этих AM>> регистров (если вдруг функция захочет их поюзать), либо размещению AM>> локальных переменных в памяти. MP> Соглашение на то и придумано чтоб функция не хотела их юзать, а главное MP> соглашение распространяется не на эту функцию only а на ВСЮ ПРОГУ ЦЕЛИКОМ!
Если в функции нужно 10 локальных переменных, что будешь делать? Скажешь, что задача не имеет решения и откажешься от работы? Или все таки положишь часть локальных в ОЗУ?
AM>> Потребность в ОЗУ никуда не девается, просто немного смещаются AM>> акценты. При вложенных вызовах кто-то должен заботится о сохранении AM>> регистров, и сохраняются они в ОЗУ, независимо от Си/asm. - -+- MP> Твоя проблема в том, что ты ты
Не волнуйся так, заикаться уже начал :)
MP> пишешь о соглашении но в реале ты его просто не можешь себе представить MP> программы написаные таким образом,
Могу, и ты это продемонстрировал. Но есть предел такой эффективности.
2-3 вложенных вызова функций и она кончилась. А главное - что особо она никому и не нужна. Только для самолюбования.
MP> поэтому всегда съезжаешь на сохранения.
Приведи пример такого соглашения, которое позволит при необходимсоти
10 локальных переменных и 2-ух аргументов функции не использовать более, чем 8 регистров х51. Причем не обязательно все параметры 8-ми битные.
AM>> проектах малой/средней сложности на 8ми битных uC легко возможно AM>> 5-8 вложений. В больших проектах - гораздо больше. Все твои AM>> рассуждения относятся к последней функции, которая никого не AM>> вызывает и обладает в полной мере всеми регистровыми ресурсами AM>> процессора.
MP> Ох уж мне это ООП.
Причем здесь вообще ООП?
MP> Все пробелмы в том, что вы не мыслите о программе как едином целом, а только MP> как о наборе кирпичей разного размера и формата, из которых надо построить MP> скажем опору моста. В то время как при построении нормального моста принято эту MP> опору отливать из бетона.
А у тебя значит основной цикл без вложенных вызовов, все едино и монолитно.
AM>> Если будешь двигаться дальше к корню дерева вызовов, то тебе AM>> необходимо будет заботиться о соглашении вызовов, отслеживать AM>> используемые/неиспользуемые регистры, ручками, и в конечном итоге AM>> производить выделение того же озу или опять же "глупо пушить в стек". MP> В конечном этоге этих пушей будет 1-2 в глобальных подпрограммах.
Это от объема задачи зависит.
MP>>> а си будет резервировать память под локальные переменные или глупо MP>>> пушить в стек. AM>> Будет по мере необходимости, но не групо. Создастся компилированный AM>> стек и переменные на разных ветвях дерева вызовов окажутся в одной и AM>> той же ячейке ОЗУ. MP> Сам факт резервирования глуп. 4-5 байтовых локальных переменных это обычно все, MP> что надо для счастья в асмовой проге x51.
Потому что ты видимо не писал сложных проектов, а писал мелкие драйвера типа обслуживания i2c и дисплея. Какой объем кода, без таблиц, в своих проектах под х51? Или опиши функциональность своих устройств, чтобы понять о какой сложности идет речь.
AM>>>> Hе надо считать, оверхеда нет, переменные упали в регистры. MP>>> А кто сказал что они свободны? Ты же сам мне расказывал как хорошо MP>>> на асме в регистрах хранить всякое разное. ;) AM>> Приведи цитату, где я так сказал. Hе можешь? MP> Hу может не ты...
Ну может в следующий раз и подумаешь, прежде чем трепаться.
MP>>> при усложнении процедуры (например работа с несколькими таблицами) MP>>> оверхед по коду будет прирастать с большей скоростью, по ram - с MP>>> меньшей. Hу порядка не будет но за 100% может легко. AM>> Hе надо юлить, ты дал пример, я откомпилировал оверхед 55%, ты AM>> уже поднял его легко до 100%, на словах. MP> Хочешь на деле? Да возьми функцию где будет преобразование с 5-тью таблицами, и MP> ты получишь 5 ПАР указателей в регистрах - локальных переменных,
Вообще, таблицы - это не столь распространенные вещи. Да, они есть, бывают, но они не обрабатываются в каждой функции проекта. И долеко не в каждом проекте их есть больше 2-ух, а тем боляя 5. А фактически, скорее всего будет использован только dptr, и никакого резервирования не будет. Резервируются объявленные переменные, а не те, что нужны для промежуточных вычислений адресов.
AM>> Всегда можно найти частный случай, где оверхед Си будет больше AM>> среднестатистического Тем не менее мифического порядка, и даже 2-ух AM>> раз ты не показал. Что и требовалось доказать. Все твои зацепки - это AM>> уже агония.
MP> Смысл мне тут агонизировать. Агонизировать надо кое кому другому когда MP> кончается озу ;)
У меня еще ни разу не кончалось.
AM>> Hо на сей раз выбор за мной. Пример тоже очень небольшой. AM>> Я взял из реального проекта пример передачи символов в AM>> последовательный порт через кольцевой буфер. Пример следующим письмом. AM>> Он не очень большой, но абсолюьно реальный. MP> Делать не буду но там будет как раз 15%, можешь орать, что победил ;).
Что-ж так? Это же реальный код. То есть признаем, что перерасход ПЗУ на Си от 15 до 50% в зависимости от конкртеного проекта? Перестаем голословно говорить о мифических порядках и разы? Я правильно понял? Только я не победил, а доказал, с инструментом в руках. Чего и вам всегда желаю делать.
AM>> Принято говорить, что на Си AM>> A = B + С; AM>> Выглядит более читаемо и сопровождаемо, чем на asm
AM>> MOV dptr,#Addr_B AM>> MOV A,@dptr AM>> MOV R7,A AM>> MOV dptr,#Addr_C AM>> MOV A,@dptr AM>> ADD A,R7 AM>> MOV Addr_A,A
MP> Это не на асм -
А на чем?
MP> это вопервых неработоспособно
Почему? Ну может в синтаксисе напутал немного.
MP> а во вторых смахивает на производное компиляторов ЯВУ ;)
А как будет правильно на асм? Сложить 2 байта из xdata и поместить результат в data.