В этой главе, в таблице 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, просмотров: 511.