Предупреждающие сообщения и сообщения об ошибках
Предупреждающие сообщения выдаются для информирования пользователей о возможных нежелательных последствиях ассемблирования оператора исходного файла. Предупреждающее сообщение выдается, например, в тех случаях, когда использование Turbo Assembler какого-либо, вообще говоря, допустимого умолчания может привести к некорректным результатам. Рекомендуется обязательно проанализировать причины предупреждающих сообщений, чтобы не допустить генерации неверного кода. Наличие этих сообщений не влияет на генерацию объектного кода Turbo Assembler. Предупреждающие сообщения имеют следующий формат:
**Warning** имя_файла(номер_строки) сообщение
Если предупреждающее сообщение выдается во время расширения макрокоманды или блока повторения, то оно будет содержать дополнительную информацию: имя макрокоманды и номер строки, при ассемблировании которой возникло это сообщение. Предупреждающее сообщение в этом случае имеет следующий формат:
**Warning** имя_файла(номер_строки) имя_макрокоманды(номер_строки_в_макрокоманде)сообщение
В отличие от предупреждающих сообщений, появление сообщений об ошибках означает, что объектный код Турбо Ассемблер генерировать не будет, хотя процесс ассемблирования будет доведен до конца. Типичное сообщение об ошибке имеет следующий формат:
**Error** имя_файла(номер_строки) сообщение
Если сообщение об ошибке выдается во время расширения макроса или блока повтора, то оно будет содержать дополнительную информацию: имя макрокоманды и номер строки, при ассемблировании которой возникло это сообщение. Сообщение об ошибке в этом случае имеет следующий формат:
**Error** имя_файла(номер_строки) имя_макрокоманды(номер_строки_в_макрокоманде)сообщение
Далее в алфавитном порядке приводятся тексты предупредительных сообщений и сообщений об ошибках:
32-bit segment not allowed without .386 (32-битовые флаги без директивы .386 не допускаются)
Это средство расширено. Теперь в операторе .MODEL можно задавать USE32 и LARGESTACK. Ранее это было сообщение "USE32 not allowed without .386").
Argument needs type override (Требуется явно указать тип операнда)
Требуется явно указать размер, или тип, выражения, т.к. он не может быть определен из контекста. Например, ошибочной является следующая команда:
mov [bx],1
Ошибки такого рода обычно корректируются с помощью операции PTR, позволяющей установить размер операнда:
mov WORD PTR[bx],1
Argument to operation or instruction has illegal size (Операнд операции или команды имеет недопустимый размер)
В операции указан операнд, имеющий тип, недопустимый для данной операции. Например:
Q LABEL QWORD QNOT = NOT Q ; операнд операции отрицания не может иметь тип QWORD
Arithmetic overflow (Арифметическое переполнение)
Потеря значащих цифр при вычислении значения выражения. Например:
X = 20000h * 20000h ; результат занимает более 32 бит
Точность всех арифметических операций - 32 бита.
ASSUME must be segment register (В директиве ASSUME должен быть указан сегментный регистр)
В директиве ASSUME можно указывать только сегментные регистры, во всех остальных случаях выводится данное сообщение об ошибке. Например, ошибочной является директива:
ASSUME ax:CODE
Bad keyword in SEGMENT statement (Неверное ключевое слово в операторе SEGMENT)
Один из параметров директивы SEGMENT: тип выравнивания, тип объединения или тип сегмента имеет недопустимое значение. Например:
DATA SEGMENT PAFA PUBLIC ; вместо PARA указано PAFA
Can"t add relative quantities (Нельзя складывать относительные адреса)
Выражение содержит операцию сложения двух адресов, что является бессмысленной операцией. Например:
ABC DB ? DEF = ABC + ABC ; ошибка: нельзя складывать два относительные адреса
Можно вычитать относительные адреса. Можно добавить константу к относительному адресу, например:
XYZ DB 5 DUP(0) XYZEND EQU $ XYZLEN = SYZEND - XYZ ; совершенно верно XYZ2 = XYZ + 2 ; тоже верно
Can"t address with currently ASSUMEd segment registers (Невозможна адресация из текущих, установленных директивой ASSUME, сегментных регистров)
В выражении содержится ссылка на переменную, для доступа к которой не специфицирован сегментный регистр. Например:
DSEG SEGMENT ASSUME ds:DSEG mov si,MPTR ; не определен сегментный регистр, который ; обеспечил бы доступ к сегменту XSEG DSEG ENDS XSEG SEGMENT MPTR DW ? XSEG ENDS
Can"t convert to pointer (Невозможно преобразование в указатель)
Часть выражения не может быть преобразована в указатель на память, например, с помощью операции PTR:
mov cl,[BYTE PTR al] ; AL нельзя преобразовать в указатель
Can"t emulate 8087 instruction (Невозможна эмуляция команд сопроцессора 8087)
В Турбо Ассемблере параметром командной строки /E либо с помощью директивы EMUL установлен режим генерации эмулированных команд арифметики с плавающей точкой, однако текущая команда не может быть эмулирована. Например:
EMUL FNSAVE [WPTR] ; эта команда не может быть эмулирована
Некоторые команды не поддерживаются эмуляторами арифметики с плавающей точкой. Это команды FNSAVE, FNSTCW, FNSTENV и FNSTSW.
Can"t make variable public (Переменная не может быть объявлена как PUBLIC)
Переменная была уже ранее объявлена таким образом, что уже не может быть определена как общая (PUBLIC). Например:
EXTRN ABC:NEAR PUBLIC ABC ; ошибка: ABC уже ранее объявлена с атрибутом EXTRN
Can"t override ES segment (Нельзя переопределить сегмент ES)
В текущем операторе указан регистр, использование которого в данной команде недопустимо. Например:
STOS DS:BYTE PTR[di]
В команде STOS для определения целевого адреса допускается использовать только регистр ES.
Can"t subtract dissimilar relative quantities (Недопустимое вычитание относительных адресов)
Выражение содержит операцию вычитания двух адресов, которая для данных адресов является недопустимой. Данное сообщение выдается, например, в том случае, если адреса находятся в разных сегментах. Например:
SEG1 SEGMENT A: SEG1 ENDS SEG2 SEGMENT B: mov ax,B-A ; недопустимо, поскольку A и В находятся в разных сегментах SEG2 ENDS
Can"t use macro name in expression (Недопустимо использование имени макрокоманды в качестве операнда выражения)
Имя макрокоманды указано в качестве операнда выражения. Например:
MyMac MACRO ENDM mov ax,MyMac ; ошибка!
Can"t use this outside macro (Использование данного оператора недопустимо вне макроопределения)
Вне макроопределения указана директива, которую допускается использовать только внутри макроопределений. К таким директивам относятся, например, ENDM и EXITM. Например:
DATA SEGMENT ENDM ; ошибка: вне макроопределения недопустимо
Code or data emission to undeclared segment (Не объявлен сегмент для кода или данных)
Оператор, генерирующий код или данные, не принадлежит ни одному из сегментов, объявленных директивами SEGMENT. Например:
; Первая строка файла inc bx ; ошибка: не определен сегмент END
Генерировать данные или код можно только внутри какого-либо сегмента.
Constant assumed to mean Immediate const (Константа интерпретируется как непосредственная)
Это предупреждающе сообщение выдается для выражений типа [0]. В режиме MASM это выражение интерпретируется как непосредственная константа, равная 0. Например:
mov ax,[0]; означает mov ax,0, а не mov ax,ds:[0]
1 2 3 4 5 6 7 8 9 10
8 8 8
|