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

Hello George!

05 Feb 04 18:42, George Shepelev wrote to Roman Gorbunov:

И что там ?

Roman

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

Reply to
Roman Gorbunov
Loading thread data ...

Hello, Andy!

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

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

AM> Andy WBR! Maxim Polyanskiy.

Reply to
Maxim Polyanskiy

Leha, ты ещё здесь сидишь?

Пятница Февраль 06 2004 19:14, Leha Bishletov wrote to George Shepelev:

MP>>>> "какие возможности есть у ЯВУ, которых нет у АСМ" ;) LB>>> Контроль типов, GS>> Есть в Borland TASM LB>>> работа со структурами, GS>> Есть в Borland TASM

LB> Честно скажу, что не знаю TASM,

Это не страшно.

LB> но уверен,

;)

LB> что его контроль типов не настолько широк как в С. Hапример: LB> MOV ax, addr_some_data LB> MOV bx, (data) LB> MOV (ax), bx

LB> Будет проверено, что типы в (addr_some_data) и в (data) совпадают?

Во-первых

MOV ax, offset addr_some_data

Это если данные в текущем сегменте данных.

Во-вторых

MOV bx,[data]

безусловно будет проверено соответствие типов.

В-третьих

MOV [ax],bx ; (нехорошая команда, ну да ладно)

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

Пример со структурами тоже показывать придётся?

Георгий

Reply to
George Shepelev

Roman, ты ещё здесь сидишь?

Пятница Февраль 06 2004 22:32, Roman Gorbunov wrote to George Shepelev:

Красиво скипаешь! Кто научил? ;)

Там количество специализированных контроллеров, выполняющих отдельные задачи, должно тебя заинтересовать...

Георгий

Reply to
George Shepelev

Hello George!

07 Feb 04 06:10, George Shepelev wrote to Roman Gorbunov:

RG>> И что там ?

И что, они там все на одной плате стоят ? Очень интересно....

Roman

... Feeling claustrophobic like the walls are closing in

Reply to
Roman Gorbunov

Hello George.

07 Feb 04 06:05, you wrote to Leha Bishletov:

GS> В-третьих

GS> MOV [ax],bx ; (нехорошая команда, ну да ладно)

GS> это трюк, здесь ассемблер позволяет программисту делать всё что GS> угодно, предполагается что голова на плечах программиста имеется.

Косвенная адресация уже является трюком?

Alexey

Reply to
Alexey Boyko

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

Reply to
Alexey Boyko
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 напишет ещё более плохой код.
Reply to
Oleksandr Redchuk

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.

Reply to
Maxim Polyanskiy

Roman, ты ещё здесь сидишь?

Суббота Февраль 07 2004 08:44, Roman Gorbunov wrote to George Shepelev:

А это обязательно?

Сейчас во многих системах как раз наблюдается процесс перехода на "распределённые" решения. Любители "суперпроцев с многозадачностью" могут испытать свои силы, решив эти задачи по-своему ;)

Георгий

Reply to
George Shepelev

Alexey, ты ещё здесь сидишь?

Суббота Февраль 07 2004 15:24, Alexey Boyko wrote to George Shepelev:

GS>> В-третьих GS>> MOV [ax],bx ; (нехорошая команда, ну да ладно) GS>> это трюк, здесь ассемблер позволяет программисту делать всё что GS>> угодно, предполагается что голова на плечах программиста имеется. AB> Косвенная адресация уже является трюком?

Косвенная регистровая позволяет проделывать трюки. Поэтому её нужно использовать аккуратно. Если головы на плечах нет, чудеса могут возникать неописуемые! ;)

Георгий

Reply to
George Shepelev

Hello Maxim,

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

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

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

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

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

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

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

Reply to
Andy Mozzhevilov

Hello Alexey,

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

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

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

Reply to
Andy Mozzhevilov

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.

Reply to
Maxim Polyanskiy

Hello Andy.

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

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

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

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

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

Alexey

Reply to
Alexey Boyko

MP> У вас странное понимание слова реалтаймовые. Логика многозадачности (какая MP> бы MP> не была) жрет ресурс настолько сильно что реалтаймовые задачи выгодно MP> решать на MP> 2-х гораздо более дешевых и более медленных cpu.

Чушь какая. А что вообще такое логика многозадачности? Переключение задач? Чушь. Синхронизация? С двумя цпу всё будет ещё хуже. Только вот не надо тут сказаок про относительную производительность и её отношение неизвестно к чему.

Reply to
Kirill Frolov

AB> Hello Andy.

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

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

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

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

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

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

Reply to
Andy Mozzhevilov

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> А что ты тогда видел кроме того, что мало коментариев? ;)

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

Reply to
Andy Mozzhevilov

Hello George!

08 Feb 04 16:27, George Shepelev wrote to Roman Gorbunov:

RG>> И что, они там все на одной плате стоят ?

Если склероз то отмотай назад и посмотри о чем была речь в моем писме Полянскому.

Как раз наоборот, с появлением высокопроизводительных кристалов распр. решения потеряли актуальность. Правда для этого надо знать Си и RTOS. Hа ассемблере ты там всю жизнь будешь писать.

Roman

... From a battle i've come, to a battle i ride

Reply to
Roman Gorbunov

Привет, George! Вы писали для Leha Bishletov , Sat, 07 Feb 2004 06:05:04 +0300:

MP>>>>> "какие возможности есть у ЯВУ, которых нет у АСМ" ;) LB>>>> Контроль типов, GS>>> Есть в Borland TASM LB>>>> работа со структурами, GS>>> Есть в Borland TASM LB>> Честно скажу, что не знаю TASM, GS> Это не страшно. LB>> но уверен, GS> ;) LB>> что его контроль типов не настолько широк как в С. Hапример: LB>> MOV ax, addr_some_data LB>> MOV bx, (data) LB>> MOV (ax), bx LB>> Будет проверено, что типы в (addr_some_data) и в (data) LB>> совпадают? GS> Во-первых GS> MOV ax, offset addr_some_data

GS> Это если данные в текущем сегменте данных.

GS> Во-вторых

GS> MOV bx,[data] GS> безусловно будет проверено соответствие типов.

Соответствие byte/word/dword? Даже знаковый беззнаковый не различаются ...

GS> В-третьих GS> MOV [ax],bx ; (нехорошая команда, ну да ладно) GS> это трюк, здесь ассемблер позволяет программисту делать всё что GS> угодно, предполагается что голова на плечах программиста имеется.

Из того, что ты написал Alexey Boyko можно сделать вывод, что программирую на АСМ следует избегать косвенной регистровой адресации или "чудеса могут возникать неописуемые!". А на С работа с указателями котролируется.

GS> Пример со структурами тоже показывать придётся?

Не надо. Там у АСМ еще хуже будет, особенно если взять mpasm, а не tasm. Принципиальная проблема с контролем типов в АСМ заключается в том, что после попадания в регистр вся информация о типе данных исчезает, остается только размер. В итоге есть гораздо больше шансов совершить ошибку, которую не заметит компилятор.

WBR, Leha Bishletov. E-mail: snipped-for-privacy@rol.ru

Reply to
Leha Bishletov

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.