На главную
Подписка
Новости










Главная / MS-DOS / MS-DOS. РУКОВОДСТВО РАЗРАБОТЧИКА / Глава 1 / Фазовые ошибки и некоторые особенности MASM Сделать домашней страницей Добавить в избранное Написать писмо

НАЗАД СОДЕРЖАНИЕ ВПЕРЁД

Фазовые ошибки и некоторые особенности MASM

С использованием операторов MASM связана одна важная особенность. MASM является двухпроходным ассемблером, назначающим значения символам на первом проходе и затем вычисляющим символы при втором проходе. Программные метки и метки данных являются символами. Их значения определяются во время первого прохода, а затем используются на втором проходе для генерации программного кода.


Рассмотрим следующее дерево событий. При обнаружении ссылки вперед MASM не распознает метку на первом проходе и не способен определить ее тип. Попытка ссылки на этот символ вызывает появление сообщения об ошибке "Символ не определен". MASM обнаруживает эту ошибку на первом проходе, но подавляет ее и продолжает ассемблирование. MASM способен подавить ошибку, предположив тип символа из контекста, в котором он появился. Если это предположение неверно, MASM может закончить свою работу, выдав сообщение "фазовая ошибка между проходами", или может укоротить команду и поместить после нее команду nop (нет операции), как заполнитель.


Существует два способа устранения фазовых ошибок при нормальной работе MASM. В большинстве случаев MASM способен определить тип операндов из контекста. Программисты редко применяют переходы в сегменте данных и обычно не добавляют программных адресов. Для тех специальных случаев, когда MASM делает ошибочные предположения, программист может определить порядок работы ассемблера, используя оператор перекрытия PTR (указатель). С помощью оператора PTR программист может явно указать тип ссылки вперед, и, следовательно, MASM не сделает ошибочного предположения. Однако, пытаясь выработать многоцелевые команды макро, мы значительно увеличиваем вероятность ошибочного выражения. Если наши многоцелевые команды предназначены для обработки любых классов операндов, точное значение такого класса трудно определить из контекста. Кроме того, хотя использование PTR и может помочь в некоторых подобных случаях (как мы увидим в макро @PushOP), оно не достигает цели освобождения программиста от излишних деталей.


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


НАЗАД СОДЕРЖАНИЕ ВПЕРЁД

Hosted by uCoz