встретил оператора ENDIF, закрывающего условный
0004 ???????????????? EIGHT_BYTE DQ ?
000C ??????????????????? TEN_BYTE DT ?
?
FLD
0016 9B D9 C1 1 DB 09BH,0D9H,0C1H ;
FLD 1
0019 9B D9 C1 1 DB 09BH,0D9H,0C0H+1
FLD FOUR_BYTE
001C 9B 1 DB 09BH
001D D9 06 0000 R 1 ESC 8,FOUR_BYTE ;
0021 9B 1 DB 09BH
0022 DB 2E 0000 R 1 ESC 01DH,FOUR_BYTE ;
FLD EIGHT_BYTE
0026 9B 1 DB 09BH
0027 DD 06 0004 R 1 ESC 40,EIGHT_BYTE ;
FLD TEN_BYTE
002B CODE ENDS
END
Фиг. 6.6 Вложенное условное ассемблирование
встретил оператора ENDIF, закрывающего условный оператор. Это
происходит в результате раннего входа из макрокоманды. Хотя это и
нежелательно, но ни к каким разрушительным последствиям не
приводит. Если оператор EXITM расположен вне условного оператора,
то предупреждение не выводится.
Оператор EXITM необходим в данной макрокоманде, так как
ассемблер проверяет все условные операторы, даже если они не
транслируются. В нашем случае, если операнд SOURCE пуст, оператор
ELSE предотвращает генерацию всех других вариантов команды FLD.
Однако, продолжая просмотр, ассемблер проверяет оператора
IFE TYPE SOURCE
хотя и не может сгенерировать никакого кода. Если SOURCE пусто,
то ассемблер фиксирует синтаксическую ошибку. Вы можете не обращать
внимания на эту ошибку, но принимать трансляцию с сообщениями об
ошибках идет в разрез с нашими правилами. С другой стороны,
использование оператора EXITM приводит к предупреждению "Открытое
условие". Оно нежелательно, но это меньшее из двух зол.
Заметим, что макрокоманда FLD использует ветвь ELSE чтобы
указать на необходимость вычисления выражения в поле операнда
только в случае непустоты этого поля. IF-выражения, содержащие
оператор TYPE, определяют, какой тип операнда использовался при
вызове макрокоманды. Хотя это не упоминается в Руководстве по
Макроассемблеру, оператор TYPE возвращает значение 0, если операнд
является не символическим именем, а константой. Выбор такого
способа в данной макрокоманде вызван скорее соображениями
работоспособности, чем стремлением к элегантности.
Содержание Назад Вперед