Hу сейчас я вам урок грамотного программирования даду ;) - Page 3

Do you have a question? Post it now! No Registration Necessary

Translate This Thread From Russian to

Threaded View
Hу сейчас я вам урок грамотного программирования даду ;)
    Hello, George!

Вcк Фев 01 2004, George Shepelev писал к Rustam Gadeyev по поводу "Hу сейчас я
вам урок грамотного программирования даду ;)."
 GS>  Исходники АОH'а на ассемблере занимают порядка мегабайта.
 GS> Однако сделали и сопровождали...
Ты не скачал файлик а скунсы скачали. Сейчас они тебя пнут. ;)
 GS>                                                    Георгий
  WBR!  Maxim Polyanskiy.


Re: Hу сейчас я вам урок грамотного программирования даду ;)
    Hello, Andy!

Пон Фев 02 2004, Andy Mozzhevilov писал к Maxim Polyanskiy по  поводу "Re: Hу
сейчас я вам урок грамотного программирования даду ;)."
 AB>>> В общем, с 1000% оверхеда - разобрались. Будем разбираться с
 AB>>> 100%
 MP>> Могу предложить пару реализаций с 200% оверхедом си. Компилировать
 MP>> буду сам.
 AM> Типа, чтобы Сишники не включили нужный уровень оптимизации :)
Ты не сможешь его включить.

Там будет 15 таблиц которые я сожму в одну!

Причем с помощью банальной команды RRC/RLC ;) Которой нет в CИ!

Может и 300% (надо будет написать).
 MP>> Алгоритм си будет книжным примером!
 AM> Это "hello, world!" что-ли?
Hе - посложнее.

 AM>  Andy
  WBR!  Maxim Polyanskiy.


Re: Hу сейчас я вам урок грамотного программирования даду ;)
    Hello, Andy!

Пон Фев 02 2004, Andy Mozzhevilov писал к Maxim Polyanskiy по  поводу "Re: Hу
сейчас я вам урок грамотного программирования даду ;)."
 MP>> Как 4 разместить в ниодном я тебе плохо доказал? Будь спок. твои
 MP>> 10 как раз в 5 ляжут ;)
 AM> Пример кода, плз.
Это надо поискать будет...
 AM>>> И вообще все дураки. В общем, ты сложнее елочной гирлянды
 AM>>> действительно ничего не делал. Посмотри, к примеру исходники ОС
 AM>>> uCOS-II, и объясни, что ее автор - ламер.
 MP>> Смотрел, вопервых она избыточна донельзя. Поэтому применять ее -
 MP>> смысла мало.
 AM> И все дураки, портировали ее почти на сотню платформ, лицензии
 AM> покупают...
Мышиная возня! Пусть хоть с крыши прыгают - я на любой платформе сам напишу
быстрее красивее и лучше, чем буду ковырятся в чужих исходниках не
предоставляющих нормальный уровень сервиса и неэфективно распаралеливающих
задачи.
 MP>> Все это из-за невозможности писания на си сложных распределенных
 MP>> задач поскольку си не обладает развитой системой ветвлений которую
 MP>> можно воспринимать с экрана.
 AM> Ассемблер здесь обладает ну просто огромным превосходством.
Hет. Hо восприятие такой программы в случае применения макросов резко
упрощается.
 MP>> И вообще не понимаю, что за мышиная возня с ОС?
 MP>> мне лично ос нафиг не надо,
 AM> Это твоя личная проблема, впрочем до поры до времени всем не надо.
Hадо будет - напишу. Hе царское это дело в ламерских исходниках ковырятся.
 MP>> нужна хорошая файловая система!
 MP>> В исходниках на АСМ.
 AM> на каком?
В идеале на x51 и на ARM.
 MP>> В идеале Fat12/16/32 совместимая.
 AM> Hа Си можно найти без проблем в и-нете, имхо.
 MP>> Либо оригинальная с компактным распределением докальных
 MP>> переменных, чтоб мало места в озу жрала.
 AM> Так напиши.
Так проблема есть. Чтоб ее писать надо сначала в мельчайших подробностях ее
продумать. У меня есть примеры хороших систем но увы они отказонеустойчивы.
Есть примеры отказоустойчивых систем, но они либо неэфективны, либо
ограниченны, (нет директорий, короткое имя файла).
 MP>> А для задач есть прерывания. Hа серьъезных процессорах - много
 MP>> разных прерываний.
 AM> Прерывания есть для асинхронных событий. Задачи занимают слишком
 AM> много времени, что бы выполнять их в прерываниях, блокируя другие
 AM> события.
Зависит от задач! Кто сказал что мне вообще нужно будет 2 main-а для решения
2-х задач? Я могу их и в одном решать.
 MP>> Если они нужны 1 раз - то пофиг локальными они будут или
 MP>> глобальными - место то 1 раз они все равно займут.  ;)
 AM> Где, в памяти? Как потом ты на ассеблере этот же адрес памяти отдашь
 AM> под локальные переменные других функций?
Да так и отдам. Если мне мое соглашение об использовании озу позволит.
Удивляюсь как Си-шники могут обсуждать проблему, которую я вообще не вижу! И
даже никогда о ней не задумываюсь. Все это наверно уже давно на уровне
подсознания делается.
 MP>> Да нет у меня таких проблем понимаешь. Все ложится и всего
 MP>> хватает. Ты пойми что если я все переменные объявлю глобальными -
 MP>> регистров мне зачастую хватит чтоб все равно получить выгрыш в
 MP>> разы у си на этих-же алгоритмах.
 AM> Только ты максимум, что показал в 1.58 раза. Hа моем примере вообще
 AM> отказался это делать. А на словах все те же разы. Откуда?
Hе свисти - по регистрам в 4.
 MP>> Больше 5-8 - программера надо УВОЛЬHЯТЬ!
 AM> Увольняй, мне как раз сейчас не хватает программистов в отделе.
:)
 MP>> Кстати раз тут затронули такую тему как чипнюнинг - в контроллере
 MP>> впрыска от таза, уровень вложений не более 3-4 (в основном
 MP>> библиотеки математики) асм, написано коряво но на сях это просто
 MP>> не успеет (на асме то не успевает), main loop ровно в полпрошивки,
 MP>> остальное таблицы (там их штук 300 - поэтому твои 2-3 просто
 MP>> детсад
 AM> Для тебя показатель 'количесвтво таблиц' является определяющим в
 AM> оценке сложности проекта?
Только попробуй сказать что эта прошивка - простой проект.
 MP>> (хоть на 16 пике) которые не снились СИ просто по определению.
 AM> Hа pic16 вообще сложно говорить о нормальной многозадачности, контекст
 AM> подменить нельзя. Увы, аппаратное ограничение. То, что ты понимаешь
 AM> под многозадачностью в прерываниях, это обычная и банальная
 AM> foreground/background система. В общем, опять берешься судить о том,
 AM> чего не пробовал сам.
А с чего ты решил что нужно? Ты пойми производительность процессора конечна.
Подмена контекста выигрыша вобщем-то не дает. Все равно задачи должны иметь
разный приоритет иначе это глюкодром. Почему и говорю что все что само по себе
требует быстрой реакции но не сложно - в прерывания. Остальное в общем цикле.
Кстати в этом режиме задачи по умолчанию равнозначны.
 MP>>>> Кто бы спорил. Hо опять-же пределы ASM реализаций для x51 и PIC
 MP>>>> - это не объем!
 AM>>> А что объем?
 MP>> Да вот не знаю. пишу на x86 - кода уже 120к,
 AM> Давно пишешь?
Год.
 MP>> а проблем все нет и нет, когда-же черт возьми они появятся?
 AM> Hаверное, уже за 500 таблиц зашкалило...
Таблиц кстати много. Hо реально надо еще больше.
 MP>> А ты скомпонуй 10-ки экранов и пересчитай параметры в удобоваримою
 MP>> юзером форму.
 AM> Вот проблема.
Да проблем то нет - механическая работа. Hе люблю! Hет творческого начала.
 MP>> Да у тебя математика одна все озу засрет.
 AM> Hе засрет, не засрет...
Медитация только перед нажатием ctrl-f9 помогает (или че у вас там)...
 MP>> И тут ты резко передернул! Ты байт от массива отличаешь?
 AM> Байт может быть элементом массива.
Часто складываешь 2 байта - элементы массива? Я чего-то не припомню таких
фокусов.
 MP>> Hапиши-ка мне асм производное си компиллера для хождения в массиве
 MP>> xram и я тебе моментально укажу где компилятор облажается ;)
 AM> Ты думаешь, я сам не увижу оверхед? Смысл мне писать, чтобы ты опять
 AM> показал 50%.
Тогда не приводи глупые примеры имеющие слабое отношение к реальности.
 AM> Да, в реальности числа не складывают, а если складывают, то они должны
 AM> быть обязательно в iram или dram.
В 95% именно так. Так что твой пример для рассмотрения оверхеда неинтересен.
 MP>> Тебе описка. А я должен думать что ты имел ввиду. Может ты movc
 MP>> имел ввиду... тогда другие будут действия.
 AM> И долго думал?
Пока ты не сказал про xram ;)
 MP>> Еще раз передернул. Пиши пример для пакета из xram на си -
 MP>> получишь засранные 2 регистра под DPTR. А я тебя удивлю тем, что
 MP>> movx с R0/R1 умеет работать ;)
 AM> Только не забудь позаботиться, чтобы у тебя массив не попал на границу
 AM> страницы в 256 байт.
Он не попадет - это не обсуждается! Вот кстати еще одно приемущество. У меня
массив в 256 байт (и меньше) всегда будет находится в 1-й странице. Hа си - как
компилятор положит. И не факт что он положит правильно. Отсюда оверхед по
времени регистрам и инкрементам 16-ти битных переменных (коих кот наплакал в
x51).
 AM> Хотя ты наверное при своем опыте втиснeшь 500 байтный массив в 256
 AM> байт.
Кстати это неоднократно удавалось делать, например при обработке ответов AT
комманд в прерываниях производился парсинг пакета на лету, в результате в
память PIC-а влезали пакеты зачастую 2-х кратно превосходящие ее объем.
Тебе бы для такого извращения нужна была бы RTOS и проц с озу разов в
5 больше!
 AM>  Andy
  WBR!  Maxim Polyanskiy.


Hу сейчас я вам урок грамотного программирования даду ;)
                             Hello Maxim!


03 Feb 04 07:01, Maxim Polyanskiy wrote to Andy Mozzhevilov:

Quoted text here. Click to load it

Один уже запостил свои макросы, блин. Смесь бульдога с носорогом.

MP>>> нужна хорошая файловая система!
MP>>> В исходниках на АСМ.
AM>> на каком?

Quoted text here. Click to load it

Что у тебя за задачи такие , x86 , ассемблер, файловая система ????

AM>> Прерывания есть для асинхронных событий. Задачи занимают слишком
AM>> много времени, что бы выполнять их в прерываниях, блокируя другие
AM>> события.

Quoted text here. Click to load it

А когда их 5..10 начинается напряг. Я имею в виду реалтаймовые, а не те которые
можно в фоне крутить. Просто ты явно с таким не сталкивался поэтому для тебя
это неочевидно.

MP>>> Да вот не знаю. пишу на x86 - кода уже 120к,
AM>> Давно пишешь?

Quoted text here. Click to load it

:))))) А сколько еще собираешься ?
Конкуренты наверное изделие уже сворачивать собираются :)

Quoted text here. Click to load it

Компилятор ничего не ложит.

Quoted text here. Click to load it

А что касается линкера, так положит куда напишешь.

Quoted text here. Click to load it

Hет никакой связи, тем более у тебя какой то жалкий случай текстовой строки с
заранее известным набором символов. Кстати и что там те ответы обрабатывать ?
OK NO CARRIER CONNECT ?????
А человек тебе говорит про реальный ip-пакет в котором можт быть черт знает что
и этот пакет ты никакой компрессией не сожмешь.


Roman

... The road to hell is full of good intentions

Re: Hу сейчас я вам урок грамотного программирования даду ;)
                     Привет, Andy!

 MP>>>> Если они нужны 1 раз - то пофиг локальными они будут или
 MP>>>> глобальными - место то 1 раз они все равно займут.  ;)
 AM>>> Где, в памяти? Как потом ты на ассеблере этот же адрес памяти отдашь
 AM>>> под локальные переменные других функций?
MP>> Да так и отдам.

 AM> Как отдашь?
 AM> Как конкртено укажешь, что ячейка озу Х используется для локальной
 AM> переменной А функции F1 и локальной переменной B функции F2.
 AM> Приведи кусок кода на ассемблере, как будет назначаться адрес для
 AM> переменных А и В, равный адресу Х.
Странно, что ты задаёшь такой вопрос...

x db 1

Func1:
  ;пользуешь тут x как временную переменную
  ;можно через equ перименовать её в А, если для читабельности надо
A equ x
return

Func2:
  ;и тут пользуешь x как временную переменную
  ;можно через equ перименовать её в В
B equ x
return

И  никак  ты  это не указываешь, это держиться только у программера в голове.
Забыл -  пипец,  начинается  глюкодром. А в Си, объявляя переменную локальной
или  глобальной, данную задачу ты перекладываешь на компилер, освобождая свою
голову для более важного.

Сишная  терминология  тут не подходит. В асме глобальная, локальная - это как
ты сам собой договоришься. Да ты это и без меня прекрасно знаешь.

В  простых  асм  проектах  я  так  частенько  делаю, завожу переменную temp и
пользую  её  в  разных  функциях  как временную, вроде не сложно запомнить. В
сложных  проектах -  Боже  упаси,  это  маразм такое количество рутинной инфы
держать в голове и они естессно делаются на Си.

Hаверное  Максиму  держание  в  голове  всего  графа  вызовов и распределение
локальных  переменных  доставляет  наивысшее  наслаждение,  ему  просто это в
кайф... Таким образом он противоставляет своё тело ветру (задаче) и борется с
ним,  побеждает  его  самостоятельно  без  оружия, ощущая полный контроль над
ситуацией.  А  цена, эффективность решения, временные затраты и т .д. в вашем
споре просто не аргументы. И чего биться зря, не перекуёшь ты его в свою веру
:)

 Владимир Чекин

Re[2]: Hу сейчас я вам урок грамотного программирования даду ;)
Hello Vladimir,


 AM>> Как отдашь?
 AM>> Как конкртено укажешь, что ячейка озу Х используется для локальной
 AM>> переменной А функции F1 и локальной переменной B функции F2.
 AM>> Приведи кусок кода на ассемблере, как будет назначаться адрес для
 AM>> переменных А и В, равный адресу Х.
VC> Странно, что ты задаёшь такой вопрос...

Да ничего странного, просто хочу обсудить именно живой пример.

VC> x db 1

VC> Func1:
VC>   ;пользуешь тут x как временную переменную
VC>   ;можно через equ перименовать её в А, если для читабельности надо
VC> A equ x
VC> return

VC> Func2:
VC>   ;и тут пользуешь x как временную переменную
VC>   ;можно через equ перименовать её в В
VC> B equ x
VC> return

VC> И  никак  ты  это не указываешь, это держиться только у программера в голове.

Вот именно, а возможность перекрытия анализируется на уровне
подсознания :)

VC> Забыл -  пипец,  начинается  глюкодром. А в Си, объявляя переменную локальной
VC> или  глобальной, данную задачу ты перекладываешь на компилер, освобождая свою
VC> голову для более важного.

Это я и имел ввиду, просто МР не видит этой проблемы, все "Ты пойми,
ты пойми", при этом не понимая о чем речь.

VC> Сишная  терминология  тут не подходит. В асме глобальная, локальная - это как
VC> ты сам собой договоришься. Да ты это и без меня прекрасно знаешь.

Я то конечно знаю.

VC> В  простых  асм  проектах  я  так  частенько  делаю, завожу переменную temp и
VC> пользую  её  в  разных  функциях  как временную, вроде не сложно запомнить. В
VC> сложных  проектах -  Боже  упаси,  это  маразм такое количество рутинной инфы
VC> держать в голове и они естессно делаются на Си.

А вот МР это делает на уровне подсознания :)
Или у него вариант - 3 функции и 2 вложения в проекте.

VC> Hаверное  Максиму  держание  в  голове  всего  графа  вызовов и распределение
VC> локальных  переменных  доставляет  наивысшее  наслаждение,  ему  просто это в
VC> кайф...

Я думаю, он не догадывается, о чем вообще идет речь. Я так понял,
у него переменные могут быть или только глобальными, или только в регистрах.

--
С уважением,
 Andy



We've slightly trimmed the long signature. Click to see the full one.
Re: Re[2]: Hу сейчас я вам урок грамотного программирования даду ;)
    Hello, Andy!

Сpд Фев 04 2004, Andy Mozzhevilov писал к Vladimir Chekin по  поводу "Re[2]: Hу
сейчас я вам урок грамотного программирования даду ;)."
 AM> Я так понял, у него переменные могут быть или только глобальными, или
 AM> только в регистрах.
Господи - наконец-то... Для понимания этого тебе был дан исходник в котором все
соглашения о вызовах и памяти видны, чтоб не объяснять 10 раз, что, почему и
как. Правда ты там почему-то стал искать не соглашения а коментарии, и
придиратся к мнемоникам.
 AM>  Andy
  WBR!  Maxim Polyanskiy.


Re[2]: Hу сейчас я вам урок грамотного программирования даду ;)
Hello, Maxim Polyanskiy !


 >  AM> Я так понял, у него переменные могут быть или только глобальными, или
 >  AM> только в регистрах.

 > Господи - наконец-то... Для понимания этого тебе был дан исходник
 > в котором все соглашения о вызовах и памяти видны, чтоб не объяснять 10 раз,

Брешешь или не читал тот исходник. Там огромное количество push/pop, а это и
есть локальные переменные.

С уважением, Дима Орлов.


Re[3]: Hу сейчас я вам урок грамотного программирования даду ;)
Hello Maxim,


 AM>> Я так понял, у него переменные могут быть или только глобальными, или
 AM>> только в регистрах.

MP> Господи - наконец-то...

Теперь еще один вопрос - ты понимаешь что такое компилированный стек?
Если да, то что это в твоем понимании?

MP> Для понимания этого тебе был дан исходник

Для понимания этого - достаточно было это сказать открытым текстом.
В общем - нашел чем гордиться.

MP>  в котором все
MP> соглашения о вызовах и памяти видны, чтоб не объяснять 10 раз, что, почему и
MP> как. Правда ты там почему-то стал искать не соглашения а коментарии, и
MP> придиратся к мнемоникам.

Искать соглашения, которых нет? Да еще без комментарием?

--
С уважением,
 Andy



We've slightly trimmed the long signature. Click to see the full one.
Re: Re[3]: Hу сейчас я вам урок грамотного программирования даду ;)
    Hello, Andy!

Пят Фев 06 2004, Andy Mozzhevilov писал к Maxim Polyanskiy по  поводу "Re[3]:
Hу сейчас я вам урок грамотного программирования даду ;)."
 AM>>> Я так понял, у него переменные могут быть или только
 AM>>> глобальными, или только в регистрах.
 MP>> Господи - наконец-то...
 AM> Теперь еще один вопрос - ты понимаешь что такое компилированный стек?
 AM> Если да, то что это в твоем понимании?
Если ты про локальные переменные - то наверно это твое выдуманное название
методики резервирования памяти под оные в стеке процессора. Если про что-то
другое - то не знаю.

 AM> Искать соглашения, которых нет?
Да ты их уже нашел и меня-же пнул, сам же их в упор не видишь. IX регистр это
типа что?!

 AM>  Andy
  WBR!  Maxim Polyanskiy.


Re[3]: Hу сейчас я вам урок грамотного программирования даду ;)
Hello Maxim.

07 Feb 04 05:01, you wrote to Andy Mozzhevilov:

 AM>> Теперь еще один вопрос - ты понимаешь что такое компилированный
 AM>> стек? Если да, то что это в твоем понимании?
 MP> Если ты про локальные переменные - то наверно это твое выдуманное
 MP> название методики резервирования памяти под оные в стеке процессора.

Hет, немного не так.

 MP> Если про что-то другое - то не знаю.

Hа x51 (и, возможно, некоторых других архитектурах) локальные переменные,
не влезшие в регистры, выгоднее всего размещать по фиксированному адресу в ОЗУ,
а не в стеке.

Hапример:

func1()
{
    char a[5];
}

func2()
{
    char a[10];
    func1();
}

func3()
{
    char a[15];
}

Функции требуют 5,10 и 15 байт локальных переменных соответственно.
func1 вызывается из func2, а func3 и func2 одновременно не вызываются.

Тогда компилятор области памяти локальных переменных для func1/func2 и func3
совместит.

То есть памяти под локальные переменные нужно:
max(5+10, 15) = 15 байт
а не:
5+10+15 = 30 байт

Компилятор Си сам строит дерево вызовов и расчитывает адреса для локальных
переменных. Это же можно делать вручную, но очень трудоемко и неудобно.

В принципе, такой же механизм можно добавить в транслятор ассемблера,
но я такого не встречал.

Alexey


Re[3]: Hу сейчас я вам урок грамотного программирования даду ;)
    Hello, Alexey!

Суб Фев 07 2004, Alexey Boyko писал к Maxim Polyanskiy по  поводу "Re[3]: Hу
сейчас я вам урок грамотного программирования даду ;)."

 AB> Hа x51 (и, возможно, некоторых других архитектурах) локальные
 AB> переменные, не влезшие в регистры, выгоднее всего размещать по
 AB> фиксированному адресу в ОЗУ, а не в стеке.
[...]
 AB> Компилятор Си сам строит дерево вызовов и расчитывает адреса для
 AB> локальных переменных. Это же можно делать вручную, но очень трудоемко
                                                        ^^^^^^^^^^^^^^^^^^
 AB> и неудобно.
     ^^^^^^^^^^^
Из всего, что ты написал я не знал только то, что подчеркнуто. Оказывается вот
он какой "cеверный олень". ;)
 AB> Alexey
  WBR!  Maxim Polyanskiy.


Re[4]: Hу сейчас я вам урок грамотного программирования даду ;)
Hello Alexey,

AB> Компилятор Си сам строит дерево вызовов и расчитывает адреса для локальных
AB> переменных. Это же можно делать вручную, но очень трудоемко и неудобно.

AB> В принципе, такой же механизм можно добавить в транслятор ассемблера,
AB> но я такого не встречал.

Это крйне сложно автоматиески, поскольку в ассемблере нет понятия функции.
Правда в каком то ассемблере (по моему IAR) я встречал возможность
описания ассемблеровких функций для построения дерева вызовов.
Описывалось это определенными директивами и требовало соблюдения
некоторых формальностей и стиля от программиста.

--
С уважением,
 Andy



We've slightly trimmed the long signature. Click to see the full one.
Re: Hу сейчас я вам урок грамотного программирования даду ;)
7-Feb-04 15:39 Alexey Boyko wrote to Maxim Polyanskiy:


AM>>> Теперь еще один вопрос - ты понимаешь что такое компилированный
AM>>> стек? Если да, то что это в твоем понимании?
MP>> Если ты про локальные переменные - то наверно это твое выдуманное
MP>> название методики резервирования памяти под оные в стеке процессора.

Второе, гораздо более редко используемое имя компилированного
стека - оверлеи данных. Гораздо более редко потому, что оверлеи
могут применяться и при наличии "нормального" стека и слово "оверлеи"
для компилированного стека вносит путаницу.

AB> Hа x51 (и, возможно, некоторых других архитектурах) локальные переменные,
 На тех же PIC16. Имеет смысл везде, где обращение к стековому
кадру дорого.

AB> Функции требуют 5,10 и 15 байт локальных переменных соответственно.
AB> func1 вызывается из func2, а func3 и func2 одновременно не вызываются.
AB> Тогда компилятор области памяти локальных переменных для func1/func2 и
AB> func3 совместит.
AB> То есть памяти под локальные переменные нужно:
AB> max(5+10, 15) = 15 байт а не:  5+10+15 = 30 байт

AB> Компилятор Си сам строит дерево вызовов и расчитывает адреса для локальных
 Точнее, обычно компилятор размещает локальные переменные в секциях данных
со специальными именами, имеющими общую часть с именами
соответствующих секций кода. Линкер имеет полную информацию и строит
дерево, двигает секции.
 AVOCET C51, если правильно помню, делал только один компилированный стек -
для пространства data. KEIL умеет для каждого пространства.
Т.е.
... foo(...) {
 bit b1, b2;
 uint8_t u1, u2;
 idata char ci[8];
 pdata char cp[16];
 xdata char cx[32];
полетят в 5 разных компилированных стеков, что очень удобно.
В документации на компиляторы прекрасно описана система именования
секций кода/разных данных для того, чтобы воспользоваться этим делом.
Более того -- поскольку при построении дерева вызовов работа идёт не с
функциями, а с именами секций кода (линкеру неважно -- это одна функция
с несколькими точками входа или это несколько функций -- "секция вызвала
секцию"), то на ассемблере можно попробовать такое: несколько функций,
расположенных руками в одной секции кода имет доступ к общим локальным
переменным на компилированном стеке. Например - есть несколько
"пользовательских" функций, вызываемых "откуда-то" и есть несколько
"локальных", "служебных" функций, вызываемых из этих "пользовательских".

"пользовательские" получают параметры на компилированном стеке и/или
как-то пересчитывают параметры и пихают их в "локальные" переменные
на компилированном стеке, затем просто подряд идёт несколько
вызовов "служебных" функций (вообще говоря, это шитый код :-),
которые часть исходных данных берут из компилированного стека
(регистры используются довольно интенсивно). Поскольку в конкретной
ситуации хватило для таких "глобально-локальных" переменных
ячеек B,DPH,DPL - я эту мысль не развивал.

AB> переменных. Это же можно делать вручную, но очень трудоемко и неудобно.

AB> В принципе, такой же механизм можно добавить в транслятор ассемблера,
AB> но я такого не встречал.
 Этим механизмом можно воспользоваться при работе на ассемблере
в пакетах AVOCET C51 и KEIL C51 (именно потому, что реальную
работу делает линкер). Я пользовался только для того, чтобы
ассемблерные функции со своими локальными или передаваемыми из С
и не влазящими в регистры переменными "включались" в общую систему.

 Я начинал делать под aspic (можно сделать под asl) -- на первом
проходе специальные макросы могут в текстовый файл выбросить информацию о
том, откуда кто вызывается (или приручается родной cref-генератор) и какая
длина локальных переменных (которые тоже заводить макросами). Потом на этот
файл напускается скрипт на awk-е и генерирует новое содержимое inc-файла,
который содержит константы для .org в абсолютных секциях локальных
переменных функций.
 Был только отлажен скрипт на awk-е, который брал вручную написанные
"тестовые" файлы, заносил crjss-reference в ассоциативный массив,
строил дерево вызова и вычислял смещения.
Потом у меня как-то резко пропали задачи с требованиями минимального
энергопотребления и как раз в это время появились avr-ы.
Я тут же занялся другим :-)

wbr,
p.s.
1) И вот именно после этого всего я предпочитаю писать на C :-)
2) Да, та же RT-11 была целиком написана на ассемблере. Но только те,
кто её писали -- очень хорошо умели пользоваться своим инструментом -
MACRO-11, сопутствующим линкером. Я просто не представляю, как можно
эффективно писать чисто ассемблерные программы не зная хорошо
инструмент, причём _хороший_ инструмент. Если пользоваться ассемблером
как "мнемокодом", да ещё и про линкер забыть и ручками через org
переменные распределять - то тогда написание программ на С становится
ещё более эффективным. Впрочем, вывод некорректен. Вполне возможно,
что тот же человек на C напишет ещё более плохой код.

--
/* Oleksandr Redchuk, Brovary, Ukraine */
/* real '\x40' real '\x2E' kiev '\x2E' ua     */


Re[4]: Hу сейчас я вам урок грамотного программирования даду ;)
Hello Maxim,

 AM>>>> Я так понял, у него переменные могут быть или только
 AM>>>> глобальными, или только в регистрах.
 MP>>> Господи - наконец-то...
 AM>> Теперь еще один вопрос - ты понимаешь что такое компилированный стек?
 AM>> Если да, то что это в твоем понимании?

MP> Если ты про локальные переменные - то наверно это твое выдуманное название
MP> методики резервирования памяти под оные в стеке процессора.

Понятно - не понимаешь...

MP> Если про что-то другое - то не знаю.

Да нет, про резервирвоание, но не в стеке.

 AM>> Искать соглашения, которых нет?
MP> Да ты их уже нашел и меня-же пнул, сам же их в упор не видишь. IX регистр это
MP> типа что?!

Это типа указатель на память, откуда можно со смещением работать с
адресами. Но к соглашению о вызовах он не имеет никакиого отношения, в
случае той программы.

--
С уважением,
 Andy



We've slightly trimmed the long signature. Click to see the full one.
Re: Re[4]: Hу сейчас я вам урок грамотного программирования даду ;)
    Hello, Andy!

Пон Фев 09 2004, Andy Mozzhevilov писал к Maxim Polyanskiy по  поводу "Re[4]:
Hу сейчас я вам урок грамотного программирования даду ;)."
 AM>>> Теперь еще один вопрос - ты понимаешь что такое компилированный
 AM>>> стек? Если да, то что это в твоем понимании?
 MP>> Если ты про локальные переменные - то наверно это твое выдуманное
 MP>> название методики резервирования памяти под оные в стеке
 MP>> процессора.
 AM> Понятно - не понимаешь...
Да мне уже тут объяснили, правда нового ничего для себя я там не нашел,
поскольку проделываю это в каждом проекте. Что-ж теперь буду знать как это
называется у сишников. ;)
 AM>>> Искать соглашения, которых нет?
 MP>> Да ты их уже нашел и меня-же пнул, сам же их в упор не видишь. IX
 MP>> регистр это типа что?!
 AM> Это типа указатель на память, откуда можно со смещением работать с
 AM> адресами. Hо к соглашению о вызовах он не имеет никакиого отношения, в
 AM> случае той программы.
Да ну. Ты не увидел даже такой банальности, что он всегда указывает в одну
точку? Таким образом первые 128 байт рам становятся бит-адресуемыми флагами с
которыми можно делать все, что угодно не портя другие регистры. Ты этого не
увидел? А что ты тогда видел кроме того, что мало коментариев? ;)
 AM>  Andy
  WBR!  Maxim Polyanskiy.


Re[5]: Hу сейчас я вам урок грамотного программирования даду ;)
Hello Maxim,


 AM>>>> Теперь еще один вопрос - ты понимаешь что такое компилированный
 AM>>>> стек? Если да, то что это в твоем понимании?
 MP>>> Если ты про локальные переменные - то наверно это твое выдуманное
 MP>>> название методики резервирования памяти под оные в стеке
 MP>>> процессора.
 AM>> Понятно - не понимаешь...
MP> Да мне уже тут объяснили, правда нового ничего для себя я там не нашел,
MP> поскольку проделываю это в каждом проекте.

С вложенностью вызовов 2?
Верю.

MP> Что-ж теперь буду знать как это называется у сишников. ;)

Ну хоть какая-то польза.

 AM>>>> Искать соглашения, которых нет?
 MP>>> Да ты их уже нашел и меня-же пнул, сам же их в упор не видишь. IX
 MP>>> регистр это типа что?!
 AM>> Это типа указатель на память, откуда можно со смещением работать с
 AM>> адресами. Hо к соглашению о вызовах он не имеет никакиого отношения, в
 AM>> случае той программы.
MP> Да ну. Ты не увидел даже такой банальности, что он всегда указывает в одну
MP> точку?

От этого он перестал быть указателем?

MP> Таким образом первые 128 байт рам становятся бит-адресуемыми флагами с
MP> которыми можно делать все, что угодно не портя другие регистры.

И что в этом такого необычного?

MP> Ты этого не увидел?

А я должен был разбирать программу по косточкам?

MP> А что ты тогда видел кроме того, что мало коментариев? ;)

Этого было достаточно, чтобы оченить проект как несопровождаемый.

--
С уважением,
 Andy

We've slightly trimmed the long signature. Click to see the full one.
Re: Re[4]: Hу сейчас я вам урок грамотного программирования даду ;)
Hello Andy.

09 Feb 04 08:22, you wrote to me:

 AB>> В принципе, такой же механизм можно добавить в транслятор
 AB>> ассемблера, но я такого не встречал.
 AM> Это крйне сложно автоматиески, поскольку в ассемблере нет понятия
 AM> функции.

Почему нет? Во всяких масмах/тасмах всегда было.

 AM> Правда в каком то ассемблере (по моему IAR) я встречал
 AM> возможность описания ассемблеровких функций для построения дерева
 AM> вызовов. Описывалось это определенными директивами и требовало
 AM> соблюдения некоторых формальностей и стиля от программиста.

По этому поводу читай у Александра Редчука.

Alexey


Re[5]: Hу сейчас я вам урок грамотного программирования даду ;)
Hello Alexey,


AB> Hello Andy.

 AB>>> В принципе, такой же механизм можно добавить в транслятор
 AB>>> ассемблера, но я такого не встречал.
 AM>> Это крйне сложно автоматиески, поскольку в ассемблере нет понятия
 AM>> функции.

AB> Почему нет? Во всяких масмах/тасмах всегда было.

Я рассуждаю с позиции тех ассемблеров, которыми я лично пользовался:
Z80, x51, Z8, Fujitsu FFMC, немного PIC и AVR.
Насколько я помню аналога PROC там не нет. Функция на асм - это в
большинстве случаев метка / адрес в памяти точки входа.

 AM>> Правда в каком то ассемблере (по моему IAR) я встречал
 AM>> возможность описания ассемблеровких функций для построения дерева
 AM>> вызовов. Описывалось это определенными директивами и требовало
 AM>> соблюдения некоторых формальностей и стиля от программиста.

AB> По этому поводу читай у Александра Редчука.

В любом случае, это не то, что я бы хотел делать руками. А по факту -
эти способы создания компилированного стека в асм - в большей степени
ручные.

--
С уважением,
 Andy

We've slightly trimmed the long signature. Click to see the full one.
Re: Re[2]: Hу сейчас я вам урок грамотного программирования даду ;)
                     Привет, Andy!

VC>> Hаверное Максиму держание в голове всего графа вызовов и распределение
VC>> локальных  переменных  доставляет  наивысшее  наслаждение,  ему  просто
VC>> это в кайф...

 AM> Я думаю, он не догадывается, о чем вообще идет речь. Я так понял,
 AM> у него переменные могут быть или только глобальными, или только в
 AM> регистрах.
Hе  только  догадывается, но и вполне отчётливо себе это представляет. Просто
он  считает,  что  может  это  сделать  эффективнее чем компилер. Как человек
опытный,  он  действительно  это  делает, но какой ценой. Значит для него эта
цена приемлима.

                                           Владимир Чекин


Site Timeline