В этой главе, в таблице 6.1 перечисляются и поясняются сообщения, воспроизводимые MASM после трансляции программы. При обнаружении ошибки в процессе обработки, ассемблер воспроизводит одно из сообщений. Кроме того, в каждом случае сомнительного синтаксиса операторов выдается то или иное предупреждающее сообщение. Сообщения о наиболее распространенных ошибках, выявленных при ассемблировании программ, а так же краткие пояснения к сообщениям приводятся в таблице 6.1.
По окончании обработки воспроизводится сообщение о завершении ассемблирования, в том числе и при отсутствии ошибок. В этом сообщении указывается число свободных байт символьного пространства, предупреждающие сообщения и ошибки, обнаруженные в процессе ассемблирования. Если была использована опция IV, то выводится также число исходных строк, общее число строк и число символьных имен.
Пример:
110 Sourse Lines (исходных строк)
Total Lines (Всего строк)
21 Symbols (символьных имен)
25684 Bytes Symbol space free (байт свободного символьного пространства)
0 Warning Errors (возможных ошибок)
0 Severe Errors (критических ошибок)
Это сообщение воспроизводится при отсутствии ошибок в транслируемой программе. Если ассемблер обнаружит ошибки в программе, то он укажет количество возможных и критических ошибок, номера строк в исходном тексте программы, где обнаружены ошибки и выдаст одно из сообщений, поясняющих ошибку.
Таблица 6.1 − Сообщения MASM с пояснениями
| Код | Сообщение | Пояснение |
| 1 | Extra characters on line Лишние символы в строке | В командной строке получена достаточная для определения управляющей директивы информация, но в нее уже введены избыточные символы |
| 3 | Unknouwn symbol type Неизвестный символьный тип | MASM не смог распознать типоразмер, указанный в метке или внешней декларации |
Продолжение таблицы 6.1
| 4 | Redefinition of symbols Переопределение символьного имени | Если какое-то символьное имя определено в двух местах, то эта ошибка будет обнаружена на первом проходе, при повторном объявлении данного имени. |
| 5 | Symbol is multi-defined Многократно определенное символьное имя | Если какое-то символьное имя определено в двух местах, то эта ошибка будет фиксироваться на втором проходе |
| 10 | Syntax error Синтаксическая ошибка | Синтаксис конкретного оператора не совпадает ни с одной из распознаваемых синтаксических конструкций. |
| 11 | Type illegal in context Недопустимый в контексте тип | Недопустимая размерность конкретного заданного типа |
| 13 | Must be declared in pass 1 Должно быть объявление на первом проходе | Существует ссылка на тот или иной компонент до его определения на первом проходе. К примеру: выражение вида IF DEBUG недопустимо, если символьное имя DEBUG не определено |
| 14 | Symbol type usage illegal Неправильное использование символьного типа | Неправильное использование символьного наименования PUBLIC |
| 16 | Symbol is reserved word В качестве символьного имени использовано зарезервированное слово | Попытка недопустимого использования зарезервированного слова ассемблера. К примеру, объявление переменной с именем MOV. |
| 17 | Forward reference is illegal Ссылка вперед недопустима | Попытка ссылки на некий компонент до его определения в первом проходе. |
| 18 | Must be register Должен быть указан регистр | Пользователь указал в качестве операнда символьное имя вместо регистра. |
| 19 | Wrong type of register Неправильный тип регистра | В директиве или инструкции указан тип регистра, отличный от требуемого. Например: INC CS, поскольку нельзя выполнить увеличение значения кодового сегмента. |
Продолжение таблицы 6.1
| 20 | Must be segment of group Должен быть сегмент или группа | Вместо требуемого сегмента или группы было указано нечто другое |
| 21 | Symbol has no segment Символьное имя без сегмента | Попытка использования символьного имени с SEG, тогда как символьному имени сегмент не отводится |
| 22 | Must be symbol type Должен быть символьный тип | Вместо одного из типов WORD, DW, QW, BYTE, и т.п. получено какое-то другое значение |
| 23 | Already defined locally Уже дано локальное определение | Попытка определить EXTERN как какое-то символьное имя, ранее уже определенное как локальное |
| 24 | Segment parameters are changed Изменены параметры сегмента | Список аргументов для SEGMENT отличается от того, который был при первом использовании сегмента |
| 25 | Non proper align/ combine type Несоответствующий комбинаторный тип | Некорректные параметры SEGMENT. Следует проверить используемые счетный и комбинаторный типы, чтобы убедиться в том, что введены правильные типы. |
| 26 | Reference to multi defined Ссылка на множественное определение | Инструкция ссылается на неоднократно определенное символьное имя |
| 27 | Operand was expected Должен быть операнд | Ассемблер обнаружил оператор вместо требуемого операнда |
| 28 | Operator was expected Должен быть оператор | Ассемблер обнаружил операнд вместо требуемого оператора |
| 29 | Division by 0 or overflow Деление на ноль или переполнение | Приведенное выражение дает деление на 0 или слишком большое число, не имеющее представления |
| 30 | Shift count is negative Отрицательный сдвиговый счет | Образовано выражение для сдвига. Дающее его отрицательное значение |
| 31 | Operand types must match Типы операндов должны соответствовать | Ассемблер обнаружил разные размерности аргументов. К примеру, оператор типа mov ax,bh является недопустимым; в качестве обоих операндов должны использоваться слова, либо байты. |
Продолжение таблицы 6.1
| 32 | Illegal use of external Недопустимое использование внешнего компонента | Недопустимое использование внешнего определения. |
| 33 | Must be record field name Должно быть имя поля записи | Вместо наименования поля записи получено нечто иное |
| 34 | Must be record or field name Должно быть имя | Вместо наименования поля или записи принято нечто иное |
| 35 | Operand must have size Операнд должен иметь размерность | Операнд должен обладать размерностью, но она не указана. |
| 36 | Must be constant ,var or label Должна быть константа, переменная или метка | Должна быть переменная, метка или константа, но вместо этого получено что-то другое. |
| 37 | Must be structure field name Должно быть имя поля структуры | Вместо имени поля структуры получено что-то другое. |
| 38 | Left operand must have segment В левом операнде должен быть указан сегмент | Операнд требует указания сегмента. К примеру, выражение вида :symbol недопустимо, вместо этого должно быть seg:symbol. |
| 39 | One operand must be const Один операнд должен быть константой | Случай недопустимого использования оператора сложения |
| 40 | Operand must be same Операнды должны быть одного типа | Недопустимое использование оператора вычитания |
| 41 | Normal type operand expected Должен быть операнд нормального типа | Получены STRUCT, WORD, BYTE или другой недопустимый операнд вместо требуемой метки переменной |
| 42 | Constant was expected Должна быть константа | Должна быть константа, но вместо нее имя переменной |
Продолжение таблицы 6.1
| 43 | Operand must have segment Операнд должен иметь сегмент | Недопустимое использование директивы SEG |
| 44 | Must be associated with data Должен быть компонент данных | Использование кодового компонента в том месте, где требуется компонент данных |
| 45 | Must be associated with code Должен быть компонент кода | Использование компонента данных в том месте, где требуется компонент кода |
| 46 | Already have base register Базовый регистр есть | В операнде использовано более одного базового регистра. Например, mov ax,[bx+bp] |
| 47 | Already have index register Индексный регистр есть | В операнде использовано более одного индексного регистра. Например, mov ax,[si+di] |
| 48 | Must be index or base register Должен быть индексный или базовый регистр | В инструкции должен быть задан индексный или базовый регистр, тогда как в квадратных скобках уже указан какой-то другой регистр. Например: mov ax, [bx+ax] |
| 49 | Illegal use of register Неправильное использование регистра | Использование какого-либо регистра в инструкции, не предусматривающей такое применение регистра или когда невозможно применение никакого регистра |
| 50 | Value is out of range Значение вне диапазона | Значение превышает возможное для ячейки или регистра. |
| 51 | Operand not in IP segment Операнд не в сегменте | Доступ к операнду невозможен, поскольку он находится вне текущего по IP сегмента |
| 52 | Improper operand type Неподходящий тип операнда | Способ использования некоторого операнда препятствует формированию операционного кода |
| 53 | Relative jump out of range Относительный переход вне диапазона | Условные переходы должны совершаться в пределах от –128 до +127 байтов относительно текущей инструкции. |
Продолжение таблицы 6.1
| 54 | Index displ. Must be constant Индексное смещение должно быть постоянным | Недопустимое использование индексного смещения |
| 55 | Illegal register value Недопустимое значение регистра | Указанное регистровое значение не укладывается в поле ‘reg’ (данное значение превышает 7) |
| 56 | No immediate mode Непосредственный режим недопустим | Непосредственные данные подставлены в качестве операнда для инструкции, которая не может использовать такие данные |
| 58 | Byte register is illegal Недопустим байтовый регистр | Использование одного из байтовых регистров в непредусмотренном для этого контексте. К примеру недопустим оператор вида PUSH AL; следует употребить вместо этого PUSH AX. |
| 59 | CS register illegal usage Недопустимое использование | Попытка непредусмотренного использования регистра CS. Например, недопустимо выражение XCHG CS,AX |
| 60 | Must be AX or AL Должен быть указан АХ или АL | Спецификация некоторого регистра, иного, чем AX и AL, в такой ситуации, когда могут быть использованы только они. Например, инструкция IN требует указания в качестве её операнда регистры AX или AL |
| 61 | Improper use of segment reg Неверно использован сегментный регистр | Спецификация сегментного регистра в том месте, где он не может быть использован. Например, непосредственное перемещение в сегментный регистр |
| 62 | No or unreachable CS Отсутствует или недоступен CS | Попытка перехода к недоступной метке |
| 63 | Operand combination illegal Недопустимая комбинация операндов | Спецификация инструкции, включающей два операнда, с недопустимым в конкретном случае способом их взаимодействия |
| 64 | Near JMP/CALL to different CS Ближние JMP/CALL к разным CS | Попытка выполнения NEAR <ближнего> перехода или обращения к ячейке в кодовом сегменте, определенном другим выражением ASSUME:CS |
Продолжение таблицы 6.1
| 65 | Label can’t have seg о verride Для метки невозможно переопределение сегмента | Недопустимое переопределение сегмента |
| 66 | Must have upcode after prefix После префикса должен быть операционный код | Использование инструкции REPE, REPNE, REPZ или REPZN без указания после нее какого-либо операционного кода |
| 67 | Can’t override ES segment Невозможно переопре-деление сегмента ES | Попытка переопределения сегмента ES в инструкции, которая не допускает такого переопределения. Например: недопустим оператор вида STOC DS:TARGET |
| 68 | Can’t reach with segment reg Нет доступа через сегментный регистр | Данная переменная не входит ни в одну директиву типа ASSUME, обеспечивающую её доступность |
| 69 | Must be in segment block Выход из сегментного блока | Попытка генерации кода вне сегмента |
| 72 | Illegal value for DUP count Недопустимое значение для счета DUP | Счет DUP должен выражаться константой в виде положительного целого числа (больше нуля) |
| 73 | Symbol already external Символьное имя уже объявлено внешним | Попытка определения локальным некоторого символьного имени, которое уже объявлено внешним |
| 74 | DUP is too large for linker Значение DUP больше возможного | Организовано такое вложение операторов DUP, которое образовало слишком большую запись |
| 75 | Usage of ? (intermediate) bad Неправильное использование | Неправильное использование неопределенного операнда (?). Например, нельзя записать ? +5 |
| 79 | Override with DUP is illegal Переопределение с DUP недопустимо | Попытка использования DUP при переопределении в операторе инициализации STRUC |
Продолжение таблицы 6.1
| 80 | Field cannot be overriden Поле не может быть переопределено | Попытка задания значения для какого-то поля в операторе инициализации STRUC, которое не может быть переопределено |
| 81 | Override is wrong type Неправильный тип переопределения | Попытка использования неправильной размерности при переопределении в операторе инициализации STRUC |
| 82 | Register can’t be forward ref Недопустима ссылка вперед на регистр | Имела место попытка ссылки вперед на сегмент |
| 83 | Circular chain of EQU aliases Цикличность в EQU | Оказалось, что EQU указывает сам на себя |
| 85 | End of file, no END directive Конец файла без директивы END | Нет оператора окончания или допущена ошибка вложения |
| 86 | Data emitted with no segment Данные формируются вне сегмента | Попытка генерации данных кодом, расположенным вне сегмента |
После трансляции исходного текста программу и получения модуля с расширением .obj, программу обрабатывает компоновщик LINK, который формирует исполняемый модуль программы. При компоновке программы также могут быть выявлены ошибки. Наиболее распространенные ошибки и сообщения о них приведены в таблице 6.2.
Таблица 6.2 − Сообщения компоновщика LINK с пояснениями
| Сообщения | Пояснения |
| Cannot find library: имя _файла .lib. Enter new file spec. Не найдена библиотека: имя_файла lib. Ввести новую спецификацию файла: | Компоновщик не может найти файл “имя_файла”.lib. Пользователь должен ответить на выданный ему запрос, задав новое имя файла, новую спецификацию пути или то и другое. |
Продолжение таблицы 6.2
| Warning: no stack is segment Предупреждение: нет стекового сегмента | Программа пользователя не содержит стекового сегмента, который специфицирован с комбинаторным типом, специфицированным как stack. |
| Cannot open response file Невозможно открыть объектный файл | LINK не может найти объектный файл, указанный пользователем. Обычно это происходит при ошибке ввода с клавиатуры |
| Cannot nest response file Вложение ответного файла невозможно | Пользователь указал в объектном файле другой объектный файл |
| Cannot open run file Невозможно открыть рабочий файл | Диск или корневая система заполнены. Чтобы освободить место, надо удалить или переместить файлы |
| Cannot open temporary file Невозможно открыть временный файл | Диск или корневая система заполнены. Чтобы освободить место, надо удалить или переместить файлы |
| Common area longer than 65535K Общая зона превышает 65535К | В программе общие переменные занимают более 64К. Эта ошибка не может произойти с объектными файлами, сформированными MASM |
| Is not a valid library Имя_файла не является правильной библиотекой | Неправильная спецификация некоторого файла как библиотечного |
| Insufficient stack space Недостаточное пространство стека | Не хватает памяти для работы компоновщика |
| Invalid object module Неправильный объектный модуль | Один из объектных модулей оказался неправильным. Следует попытаться выполнить повторную компиляцию. |
| No object modules specified Не указаны объектные модули | Пользователь не задал компоновщику имен объектных файлов |
| Out of space on run file Нет места для рабочего файла | Заполнен диск, на который записывается EXE-файл. Следует освободить необходимое для этого место на диске и повторить попытку. |
| Stack size exceeds 65535 bytes Размер стека превышает 65535 байтов | Размер, указанный для стека с применением опции /STACK, превышает 65535 байтов |
Отладчики программ
Дата: 2018-11-18, просмотров: 731.