В этом приложении перечисляются и поясняются сообщения, воспроизводимые MASM, при обнаружении наиболее распространенных ошибок, возникающих при ассемблировании программ.
По окончании обработки воспроизводится сообщение о завершении ассемблирования, и указывается число свободных байт символьного пространства, ошибки и предупреждающие сообщения, обнаруженные в процессе ассемблирования. Если была использована опция IV, то выводится также число исходных строк, общее число строк и число символьных имен.
Сообщения MASM, об ошибках обнаруженных во время трансляции приведены в порядке их номеров с короткими пояснениями в таблице 6.1.
Код
| Сообщение
| Пояснение
|
| Extra characters on line
Лишние символы в строке
| В командной строке получена достаточная для определения управляющей директивы информация, но в нее уже введены избыточные символы
|
| Unknouwn symbol type
Неизвестный символьный тип
| MASM не смог распознать типоразмер, указанный в метке или внешней декларации
|
| Redefinition of symbols
Переопределение символьного имени
| Если какое-то символьное имя определено в двух местах, то эта ошибка будет обнаружена на первом проходе, при повторном объявлении данного имени.
|
| Symbol is multi-defined
Многократно определенное символьное имя
| Если какое-то символьное имя определено в двух местах, то эта ошибка будет фиксироваться на втором проходе при каждом объявлении данного символьного имени. (см. ошибки 4 и 26)
|
| Syntax error
Синтаксическая ошибка
| Синтаксис конкретного оператора не совпадает ни с одной из распознаваемых синтаксических конструкций.
|
| Type illegal in context
Недопустимый в контексте тип
| Недопустимая размерность конкретного заданного типа
|
| Must be declared in
pass 1
Должно быть объявление на первом проходе
| Существует ссылка на тот или иной компонент до его определения на первом проходе. К примеру: выражение вида
IF DEBUG недопустимо, если символьное имя DEBUG не определено
|
| Symbol type usage illegal
Неправильное использование символьного типа
| Неправильное использование символьного наименования PUBLIC
|
| Symbol is reserved word
В качестве символьного имени использовано зарезервированное слово
| Попытка недопустимого использования зарезервированного слова ассемблера. К примеру, объявление переменной с именем MOV.
|
| Forward reference is illegal
Ссылка вперед недопустима
| Попытка ссылки на некий компонент до его определения в первом проходе.
|
| Must be register
Должен быть указан регистр
| Пользователь указал в качестве операнда символьное имя вместо регистра.
|
| Wrong type of register
Неправильный тип регистра
| В директиве или инструкции указан тип регистра, отличный от требуемого. Например: INC CS, поскольку нельзя выполнить увеличение значения кодового сегмента.
|
| Must be segment of group
Должен быть сегмент или группа
| Вместо требуемого сегмента или группы было указано нечто другое.
|
| Symbol has no segment
Символьное имя без сегмента
| Попытка использования символьного имени с SEG, тогда как символьному имени сегмент не отводится.
|
| Must be symbol type
Должен быть символьный тип
| Вместо одного из типов WORD, DW, QW, BYTE, и т.п. получено какое-то другое значение.
|
| Already defined locally
Уже дано локальное определение
| Попытка определить EXTERN как какое-то символьное имя, ранее уже определенное как локальное.
|
| Segment parameters are changed
Изменены параметры сегмента
| Список аргументов для SEGMENT отличается от того, который был при первом использовании сегмента.
|
| Non proper align/ combine type
Несоответствующий счетный / комбинаторный тип
| Некорректные параметры SEGMENT. Следует проверить используемые счетный и комбинаторный типы, чтобы убедиться в том, что введены правильные типы.
|
| Reference to multi defined
Ссылка на множествен-ное определение
| Инструкция ссылается на неоднократно определенное символьное имя (см ошибки с № 4 и 5)
|
| Operand was expected
Должен быть операнд
| Ассемблер обнаружил оператор вместо требуемого операнда
|
| Operator was expected
Должен быть оператор
| Ассемблер обнаружил операнд вместо требуемого оператора
|
| Division by 0 or overflow
Деление на ноль или переполнение
| Приведенное выражение дает деление на 0 или слишком большое число, не имеющее представления
|
| Shift count is negative
Отрицательный сдвиговый счет
| Образовано выражение для сдвига. Дающее его отрицательное значение
|
| Operand types must match
Типы операндов должны соответствовать
| Ассемблер обнаружил разные виды или размерности аргументов в той ситуации, в которой предполагается их соответствие. К примеру, оператор типа mov ax, bh является недопустимым; в качестве обоих операндов должны использоваться либо слова, либо байты.
|
| Illegal use of external
Недопустимое использование внешнего компонента
| Недопустимое использование внешнего определения.
|
| Must be record field name
Должно быть имя поля записи
| Вместо наименования поля записи получено нечто иное
|
| Must be record or field name
Должно быть имя записи или поля
| Вместо наименования поля или записи принято нечто иное.
|
| Operand must have size
Операнд должен иметь размерность
| Операнд должен обладать размерностью, но она не указана. Часто эту ошибку можно исправить, использовав оператор PTR для указания типоразмера.
|
| Must be var, label or constant
Должна быть переменная, метка или константа
| Должна быть переменная, метка или константа, но вместо этого получено что-то другое.
|
| Must be structure field name
Должно быть имя поля структуры
| Вместо имени поля структуры получено что-то другое.
|
| Left operand must have segment
В левом операнде должен быть указан сегмент
| Операнд требует указания сегмента. К примеру, выражение вида: symbol недопустимо, вместо этого должно быть seg: symbol.
|
| One operand must be const
Один операнд должен быть константой
| Случай недопустимого использования оператора сложения.
|
| Operand must be same or 1 abs
Операнды должны быть одного типа или 1 абс
| Недопустимое использование оператора вычитания.
|
| Normal type operand expected
Должен быть операнд нормального типа
| Получены STRUCT, WORD, BYTE или другой недопустимый операнд вместо требуемой метки переменной.
|
| Constant was expected
Должна быть константа
| Должна быть константа, но вместо нее имя переменной.
|
| Operand must have segment
Операнд должен иметь сегмент
| Недопустимое использование директивы SEG.
|
| Must be associated with data
Должен быть компонент данных
| Использование кодового компонента в том месте, где требуется компонент данных
|
| Must be associated with code
Должен быть компонент данных
| Использование компонента данных в том месте где требуется компонент кода.
|
| Already have base register
Базовый регистр уже есть
| В операнде использовано более одного базового регистра.
Например: mov ax, [bx+bp]
|
| Already have index register
Индексный регистр уже есть
| В операнде использовано более одного индексного регистра. Например: mov ax, [si+di]
|
| Must be index or base register
Должен быть индексный или базовый регистр
| В инструкции должен быть задан индексный или базовый регистр, тогда как в квадратных скобках уже указан какой-то другой регистр. Например: mov ax, [bx+ax]
|
| Illegal use of register
Неправильное использование регистра
| Использование какого-либо регистра в инструкции, не предусматривающей такое применение регистра или когда невозможно применение никакого регистра.
|
| Value is out of range
Значение вне диапазона
| Значение превышает возможное для ячейки или регистра.. Например: mov al, 5000 недопустимо.
|
| Operand not in IP segment
Операнд не в сегменте IP
| Доступ к операнду невозможен, поскольку он находится вне текущего по IP сегмента
|
| Improper operand type
Неподходящий тип операнда
| Способ использования некоторого операнда препятствует формированию операционного кода
|
| Relative jump out of range
Относительный переход вне диапазона
| Условные переходы должны совершаться в пределах от –128 до +127 байтов относительно текущей инструкции, но какой-то отдельный переход оказался вне этого диапазона.
|
| Index displ. Must be constant
Индексное смещение должно быть постоянным
| Недопустимое использование индексного смещения.
|
| Illegal register value
Недопустимое значение регистра
| Указанное регистровое значение не укладывается в поле ‘reg’ (данное значение превышает 7)
|
| No immediate mode
Непосредственный режим недопустим
| Непосредственные данные подставлены в качестве операнда для инструкции, которая не может использовать такие данные.
|
| Byte register is illegal
Недопустим байтовый регистр
| Использование одного из байтовых регистров в непредусмотренном для этого контексте. К примеру недопустим оператор вида PUSH AL; следует употребить вместо этого PUSH AX.
|
| CS register illegal usage
Недопустимое использование
| Попытка непредусмотренного использования регистра CS. Например, недопустимо выражение XCHG CS, AX
|
| Must be AX or AL
Должен быть указан АХ или АL
| Спецификация некоторого регистра, иного, чем AX и AL, в такой ситуации, когда могут быть использованы только они. Например, инструкция IN требует указания в качестве её операнда регистры AX или AL
|
| Improper use of segment reg.
Неправильно использован сегментный регистр
| Спецификация сегментного регистра в том месте, где он не может быть использован. Например, непосредственное перемещение в сегментный регистр.
|
| No or unreachable CS
Отсутствует или недоступен CS
| Попытка перехода к недоступной метке.
|
| Operand combination illegal
Недопустимая комбинация операндов
| Спецификация инструкции, включающей два операнда, с недопустимым в конкретном случае способом их взаимодействия.
|
| Near JMP/CALL to different CS
Ближние JMP/CALL к разным CS
| Попытка выполнения NEAR < ближнего> перехода или обращения к ячейке в кодовом сегменте, определенном другим выражением ASSUME: CS
|
| Label can’t have seg. Override
Для метки невозможно переопределение сегмента
| Недопустимое переопределение сегмента
|
| Must have upcode after prefix
После префикса должен стоять операционный код
| Использование инструкции REPE, REPNE, REPZ или REPZN без указания после нее какого-либо операционного кода.
|
| Can’t override ES segment
Невозможно переопределение сегмента ES
| Попытка переопределения сегмента ES в инструкции, которая не допускает такого переопределения. Например: недопустим оператор вида STOC DS: TARGET
|
| Can’t reach with segment reg.
Нет доступа через сегментный регистр
| Данная переменная не входит ни в одну директиву типа ASSUME, обеспечивающую её доступность.
|
| Must be in segment block
Выход из сегментного блока
| Попытка генерации кода вне сегмента
|
| Can’t use EVEN on BYTE segment
EVEN на сегменте типа BYTE не используется
| Была использована директива EVEN, тогда как задействованный сегмент объявлен байтовым
|
| Illegal value for DUP count
Недопустимое значение для счета DUP
| Счет DUP должен выражаться константой в виде положительного целого числа (больше нуля)
|
| Symbol already external
Символьное имя уже объявлено внешним
| Попытка определения локальным некоторого символьного имени, которое уже объявлено внешним
|
| DUP is too large for linker
Значение DUP превы-шает возможности компоновщика
| Организовано такое вложение операторов DUP, которое образовало слишком большую запись
|
| Usage of? (intermediate) bad
Неправильное (неопределенное) использование
| Неправильное использование неопределенного операнда (?). Например, нельзя записать? +5
|
| Override with DUP is illegal
Переопределение с DUP недопустимо
| Попытка использования DUP при переопределении в операторе инициализации STRUC
|
| Field cannot be overriden
Поле не может быть переопределено
| Попытка задания значения для какого-то поля в операторе инициализации STRUC, которое не может быть переопределено.
|
| Override is wrong type
Неправильный тип переопределения
| Попытка использования неправильной размерности при переопределении в операторе инициализации STRUC.
|
| Register can’t be forward ref
Недопустима ссылка вперед на регистр
| Имела место попытка ссылки вперед на сегмент
|
| Circular chain of EQU aliases
Цикличность в EQU
| Оказалось, что EQU указывает сам на себя
|
| 8087 opcode can’t be emulated
Невозможна эмуляция операционного кода 8087
| Текущий операционный код 8087 или операнды, которые с ним используются, образуют инструкцию, которую эмулятор не поддерживает
|
| End of file, no END directive
Конец файла без директивы END
| Нет оператора окончания или допущена ошибка вложения.
|
| Data emitted with no segment
Данные формируются вне сегмента
| Попытка генерации данных кодом, расположенным вне сегмента
|