Влад, спасибо, но это азбука, которую я, слава богу, знаю наизусть с закрытыми глазами В клоне ГНУсного ассемблера для dsPIC/PIC24 все гораздо строже. Сравнивать и подвергать логическим/арифметическим операциям можно только те символы, которые определены (defined). Даже если символ заявлен (declared), но не определен (defined), он не имеет численного значения, поэтому не подлежит никаким операциям, кроме .ifdecl/.ifndecl. А если символ не определен (defined), то с ним невозможно провести никакую операцию даже в том случае, если его объявить как .weak - это спасает линковку, но не помогает ассемблированию.
Поясню на конкретном примере. Есть программа, которая с минимальными модификациями способна работать на нескольких разных типах МК разных подсемейств - PIC24F, PIC24H, dsPIC33, dsPIC30. Для некоторых комбинаций тип МК/подсемейство МК есть полностью общие блоки кода, для некоторых - частично общие, для некоторых - уникальные. Подсемейство МК заявлено (declared) средой в одной группе внешних predeclared символов, а тип МК определен (defined) средой в другой группе внешних predefined символов, притом в ублюдочной форме - определен (defined) и осчастливлен численным значением "1" один-единственный символ из группы, а остальные при этом остаются not declared/not defined.
Такое выворачивание рук приводит к невозможности провести стройное структурирование общих блоков - например, по такой логичной схеме:
.ifdecl __dsPIC33F ; OK, __dsPIC33F is declared by IDE
codeblock1
.if (__33FJ12MC202 || __33FJ128MC802) ; fail, __33FJ128MC802 is not declared/defined
codeblock2
.elseif (__33FJ128GP706 || __33FJ128MC706) ; fail, both symbols are not declared/defined
codeblock3
.endif
.endif
Фишка в том, что любая попытка группирования defined и not defined/not declared символов обречена на неудачу - Error: non-constant expression in ".if" statement. Искусственное принудительное объявление этих переменных руками неприемлемо, а имеющийся механизм .weak, который мог бы решить эту проблему, непригоден на стадии ассемблирования, т.к. глобалит объявленное .weak'ом только наружу (для линкера). Вот поэтому и поднял этот вопрос здесь, и подниму его перед разработчиками ASM30, чтобы довели эту семантику/идеологию если не до ума, то хотя бы до суразности. А пока вынужден обходиться своими промежуточными compile-time переменными, что коробит мой эстетствующий моск :))