Flat Assembler 1.64. Мануал программера | страница 15
Если в коде встречается директива «>display
», фактически отображаются только сообщения, созданные в последний совершённый проход. В случае, если ассемблер остановился из-за ошибки, эти сообщения могут отражать спрогнозированные значения, которые еще не разрешены правильно.
Разрешение иногда может не создаться и в таких случаях ассемблер никогда не сумеет создать правильные прогнозы — по этой причине существует предел количества походов, и когда ассемблер исчерпает этот лимит, он остановится отобразит сообщение, что невозможно сгенерировать корректный вывод. Рассмотрим следующий пример:
>if ~ defined alpha
> alpha:
>end if
Если оператор «>defined
» выдает значение истина, если выражение, следующее за ним, в этом месте может быть вычислено, что в данном случае означает, что метка «>alpha
» где-то определена. Но блок выше определяет эту метку только, если значение, данное оператором «>defined
» ложь, что ведет к противоречию и делает невозможным разрешить такой код. Если, обрабатывая директиву «>if
» ассемблер должен прогнозировать, будет ли где-нибудь определена метка «>alpha
» (этого делать не приходится только если метка уже определена раньше), то какой бы ни был прогноз, всегда происходит противоположное. Поэтому ассемблирование остановится, если только метка «>alpha
» не определена где-то в коде перед вышеуказанным блоком — в этом случае, как уже было отмечено прогнозирование не требуется и блок просто будет пропущен.
Предыдущий пример может быть создан как попытка определить метку, только если этого все ещё не сделано. Эти строк неправильны, поскольку оператор «>defined
» проверяет определена ли метка где-либо вообще, и это включает определение внутри этого условного блока. Однако есть способ обойти эту проблему:
>if ~ defined alpha | defined @f
> alpha:
> @@:
>end if
«>@f
» это всегда та же метка, что ближайший следующий за ним символ «>@@
», поэтому предыдущий пример значит то же, как если бы вместо анонимной метки было определено любое уникальное имя. Если метка «>alpha
» ещё не определена, ассемблер спрогнозирует значение «>defined alpha
» как ложь, это будет однако значить, что будут определены обе метки. Но на следующем проходе ассемблер спрогнозирует, что определены обе метки, что заставит определить их вновь — так прогноз будет совпадать с результатом и процесс ассемблиования придет к правильному решению. Анонимная метка выступает здесь как маркер того, что метка «>alpha
» определена в этом месте.