Сообщения об ошибках MASM
В этом приложении перечисляются и поясняются сообщения, воспроизводимые MASM, при обнаружении наиболее распространенных ошибок, возникающих при ассемблировании программ.
По окончании обработки воспроизводится сообщение о завершении ассемблирования, и указывается число свободных байт символьного пространства, ошибки и предупреждающие сообщения, обнаруженные в процессе ассемблирования. Если была использована опция IV, то выводится также число исходных строк, общее число строк и число символьных имен.
Пример:
110 Sourse Lines (исходных строк)
145Total Lines (Всего строк)
21 Symbols (символьных имен)
25684 Bytes Symbol space free (байт свободного символьного пространства)
0 Warning Errors (возможных ошибок)
0 Severe Errors (критических ошибок)
Сообщения MASM, об ошибках обнаруженных во время трансляции приведены в порядке их номеров с короткими пояснениями в таблице 6.1.
Таблица 6.1 Сообщения MASM с пояснениями
Код | Сообщение | Пояснение |
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 Данные формируются вне сегмента | Попытка генерации данных кодом, расположенным вне сегмента |
Дата добавления: 2016-01-26; просмотров: 3744;