я уже писал в этой теме, но напомню снова.
давно мне потребовалось сделать для ассемблера AVR некое подобие команд ENTER и LEAVE из системы команд i80x86. ENTER сохраняет в стек все "рабочие" регистры, а LEAVE, соответственно, восстанавливает их из стека - незаменимо для обработчиков прерывания.
так вот, при помощи макросов я (с помощью добрых людей с форума Электроникс) сделал аналоги этих команд, но лучше.
макрос ENTER принимал в произвольном порядке до 32 регистров в качестве параметров, которые и сохранял в стек. а макрос LEAVE без параметров (!!!) восстанавливал в нужном порядке эти регистры из стека. единственное ограничение - эти макросы не могли быть вложенными, но кому придет в голову внутри обработчика прерывания дважды сохранять рабочие регистры?!
в итоге обработчик прерываний выглядит примерно так:
Код: Выделить всё
int_timer_overflow:
ENTER r0, r2, r16
...
LEAVE
retiи фишка тут была в том, что если вам вдруг стало не хватать трех упомянутых регистров для обработчика, вы могли просто дописать в список параметров макроса ENTER нужные вам регистры, и всё! или наоборот, удалить те, без которых обошлись - LEAVE при этом отработает строго так, как и необходимо.
вот это на самом деле полезные фичи, избавляющие от копипастинга "входа/выхода в/из обработчика", и, главное, избавляющих от необходимости следить за порядком восстановления их из стека.
вот наличие системы макросов, которые позволяют все это сделать, и делают ассемблер по-настоящему удобным, а не все эти "переменные" и т.п... это баловство одно.
Добавлено after 8 minutes 6 seconds:
КРАМ, вам невозможно объяснить что-либо ровно по этой самой причине. тем более что вы даже не снисходите до того, чтобы как-то доказывать свою точку зрения. догматизм в эталонном виде.КРАМ писал(а):Невозможно что либо объяснить человеку, который слышит и слушает только себя. Поэтому я и завершил дебаты.
да ну?! то есть если у вас в Си объявлена переменная extern long var1; а в ассемблерном модуле вы напишите public var1: .byte 2 (или как там у вас принято по синтаксису), это будет одно и то же? или у вас настолько продвинутый ассемблер, что умеет находить связь с сишными заголовками и проверять типы и размер "областей памяти"?КРАМ писал(а):Нет, в ассемблере они имеют ровно такую же размерность и отображение, как и в Си
не знаю, из какого говна устрицы ели вы, но никогда "можно" не доказывало, что "нужно". и вряд ли когда такое будет.КРАМ писал(а):Для тех, кто ел устрицы. Из минтая.
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!


