722 lines
32 KiB
Plaintext
722 lines
32 KiB
Plaintext
|
CHAPTER 14 DESCRIPTIONS OF A86 ERROR MESSAGES
|
|||
|
|
|||
|
|
|||
|
~01 Unknown Mnemonic~
|
|||
|
|
|||
|
Most assembly-language lines start with a built-in instruction
|
|||
|
mnemonic such as MOV or ADD. The only circumstances in which
|
|||
|
a line can start with non-built-in symbol are if the symbol is
|
|||
|
a macro name or INT equate, or if the symbol is now being
|
|||
|
defined, as indicated by a limited set of following symbols: a
|
|||
|
colon, EQU, DB, DW, etc. This line started with a
|
|||
|
non-built-in symbol which did not fall into any of the above
|
|||
|
categories. You might have misspelled an instruction
|
|||
|
mnemonic, or misspelled the following word.
|
|||
|
|
|||
|
~02 Jump > 128~
|
|||
|
|
|||
|
The destination operand of a conditional jump must be a label
|
|||
|
within 128 bytes of the end of the instruction. (Precisely,
|
|||
|
from -128 to +127 from the next instruction, which is from
|
|||
|
-126 to +129 from the start of the conditional jump.) This
|
|||
|
error is reported in three possible places:
|
|||
|
|
|||
|
1. At the conditional jump. The operand is more than 126
|
|||
|
bytes before the jump, or the operand is not a label (e.g.
|
|||
|
you tried an indirect conditional jump through a variable,
|
|||
|
which isn't allowed)
|
|||
|
|
|||
|
2. At a label definition. In this case, you use your editor
|
|||
|
to search backwards for references to the label. One or
|
|||
|
more of the earliest conditional jumps found are too far
|
|||
|
away.
|
|||
|
|
|||
|
3. At a RET, RETF, or IRET instruction. You use your editor
|
|||
|
to search backwards for that flavor of RET used as the
|
|||
|
operand to a conditional jump (the A86 conditional return
|
|||
|
feature). The earliest such jumps not satisfied by a
|
|||
|
previous RET are too far away.
|
|||
|
|
|||
|
You usually correct this error by rearranging your code, or
|
|||
|
(better) by breaking intervening code off into subroutines. If
|
|||
|
desperate, you can replace "Jcond" with "IF cond JMP".
|
|||
|
|
|||
|
~03 [BX+BP] And [SI+DI] Not Allowed~
|
|||
|
|
|||
|
The 86 instruction set does not support the combinations of
|
|||
|
indexing registers indicated in the error message. In
|
|||
|
previous versions of A86, this error was reported in other
|
|||
|
illegal operand combinations; I've attempted to change other
|
|||
|
cases to error 14. If you ever find otherwise, let me know.
|
|||
|
|
|||
|
~04 Bad Character In Number~
|
|||
|
|
|||
|
All numbers, and only numbers, start with a decimal digit.
|
|||
|
(It's illegal to have a symbol begin with a digit; e.g.
|
|||
|
01MYVAR .) You have coded something that starts with a
|
|||
|
decimal digit but does not have the correct format for a
|
|||
|
numeric constant. See Chapter 8 for detailed descriptions of
|
|||
|
the formats of both integer and floating constants.
|
|||
|
14-2
|
|||
|
|
|||
|
~05 Operands Not Allowed~
|
|||
|
|
|||
|
When this error is reported it usually means that you have
|
|||
|
provided something more than just the mnemonic for an
|
|||
|
instruction that does not have any operands: e.g., PUSHF,
|
|||
|
STOSB, STC, FLDPI, CLTS. It's also called in other contexts
|
|||
|
when the assembler expects nothing more on the line; e.g.,
|
|||
|
NAME with more than just a single name following, or something
|
|||
|
following the word ENDS.
|
|||
|
|
|||
|
~06 Symbol Required~
|
|||
|
|
|||
|
This is reported in numerous situations where A86 requires
|
|||
|
some sort of symbol: either a built-in assembler mnemonic, or
|
|||
|
a symbol you define. (It's possible that a number or some
|
|||
|
punctuation marks are legal in the context, and that they have
|
|||
|
already been checked for.) Instead of a symbol, a punctuation
|
|||
|
mark or out-of-context number was seen. The contexts in which
|
|||
|
this error can occur include:
|
|||
|
|
|||
|
* the start of a line (characters hex 3C or greater)
|
|||
|
|
|||
|
* after the following at the start of a line: a symbol you
|
|||
|
define, #, #IF, IF, CODE, or DATA
|
|||
|
|
|||
|
* where operands to the following directives are expected:
|
|||
|
NAME, PUBLIC, EXTRN, GROUP, SEGMENT
|
|||
|
|
|||
|
* after ">" denoting a local-label forward reference
|
|||
|
|
|||
|
~07 Local Symbol Required~
|
|||
|
|
|||
|
This is reported when something other than a generic local
|
|||
|
label (letter followed by one or more digits) follows a ">"
|
|||
|
mark, which denotes a local-label forward reference. If you
|
|||
|
meant "greater than" you use the GT operator instead.
|
|||
|
|
|||
|
~08 Too Many Operands~
|
|||
|
|
|||
|
This is reported for instructions and directives requiring a
|
|||
|
limited number of operands, for which the limit is exceeded.
|
|||
|
Since operands are separated by commas, you have too many
|
|||
|
commas-- possibly an extra comma between the mnemonic and
|
|||
|
first operand, or at the end of the operands.
|
|||
|
|
|||
|
~09 Constant Required~
|
|||
|
|
|||
|
This is reported for instructions and directives (ENTER, RET,
|
|||
|
RADIX, etc.) requiring operands that are an immediate constant
|
|||
|
number; and for expression operators (*, /, SHL, OR, NOT, BY,
|
|||
|
etc.) whose operands must be constant. In some cases a
|
|||
|
limited number of forms other than constants are acceptable,
|
|||
|
but the assembler has already checked for and not found those
|
|||
|
possibilities.
|
|||
|
|
|||
|
~10 More Operands Required~
|
|||
|
14-3
|
|||
|
|
|||
|
This is reported for instructions requiring two operands, for
|
|||
|
which you have provided no operands or only one operand. You
|
|||
|
might have left out the comma separating the operands.
|
|||
|
|
|||
|
~11 Constant/Label Not Allowed~
|
|||
|
|
|||
|
This is reported when you have given a constant number in a
|
|||
|
place where it isn't allowed-- usually as a destination
|
|||
|
operand to an instruction, such as the first operand to a MOV
|
|||
|
or ADD. If you meant the operand to be the memory location
|
|||
|
with the constant offset, you must convert the type by
|
|||
|
enclosing the operand in brackets [ ] or appending a
|
|||
|
size-specifier (B, W, D, Q, or T) to the number.
|
|||
|
|
|||
|
~12 Segment Register Not Allowed~
|
|||
|
|
|||
|
This is reported when you have used a segment register in an
|
|||
|
instruction where it isn't allowed. The only instructions
|
|||
|
allowing segment registers as operands are MOV, PUSH, and POP.
|
|||
|
You can't, for example, ADD into a segment register. If you
|
|||
|
want to do anything with a segment register value, you have to
|
|||
|
MOV it into a general register, perform the operation, then
|
|||
|
MOV the result back to the segment register.
|
|||
|
|
|||
|
~13 Byte/Word Combination Not Allowed~
|
|||
|
|
|||
|
This is reported in a two-byte instruction in which one
|
|||
|
operand is byte-sized and the other word-sized; or in an
|
|||
|
instruction with a byte-sized destination and an immediate
|
|||
|
source whose value is not byte-sized (high byte not 0 or 0FF).
|
|||
|
If one of the operands is a memory variable of the wrong size,
|
|||
|
you either change the declaration of the variable (DB to DW or
|
|||
|
vice versa) or override the size of the variable in this
|
|||
|
instruction only, by appending a " B" or " W" to the memory
|
|||
|
operand.
|
|||
|
|
|||
|
~14 Bad Operand Combination~
|
|||
|
|
|||
|
This is reported when you attempt to add or combine terms in
|
|||
|
an operand expression that do not allow combination. An
|
|||
|
example of this would be DT 3.7+BX. Only constants can be
|
|||
|
added to floating point numbers.
|
|||
|
|
|||
|
This is also reported when you have two operands that are
|
|||
|
mismatched in size, and the mismatch is something other than
|
|||
|
Byte vs. Word. Example: MOV AL,D[0100].
|
|||
|
|
|||
|
~15 Bad Subtraction Operands~
|
|||
|
14-4
|
|||
|
|
|||
|
This is reported when you attempt to subtract terms in an
|
|||
|
operand expression that do not allow subtraction, or if the
|
|||
|
right-hand side to a subtraction is missing. If the
|
|||
|
right-hand side to a subtraction is a non-forward-referenced
|
|||
|
constant, then the left side can be almost anything.
|
|||
|
Otherwise, the operands must match; e.g., labels from
|
|||
|
relocatable segments must be in the same segment (in which
|
|||
|
case the answer is an absolute constant; namely, the size of
|
|||
|
the block of memory between the two labels).
|
|||
|
|
|||
|
~16 Definition Conflicts With Forward Reference~
|
|||
|
|
|||
|
This error occurs when the assembler has previously guessed
|
|||
|
the type of a forward-referenced symbol in order to determine
|
|||
|
what kind of instruction to generate, and the guess turned out
|
|||
|
to be wrong. The error is reported at the time the symbol is
|
|||
|
defined. For example, when A86 sees MOV AX,FOO, it will
|
|||
|
assume FOO is an immediate value. This error is reported if
|
|||
|
FOO turns out to be a word variable: FOO DW 0. You need to
|
|||
|
search backwards from the error message, to references of FOO,
|
|||
|
and specify the type you intend to be used: MOV AX,FOO W. If
|
|||
|
you really did intend to load the offset of FOO and not the
|
|||
|
memory contents, you can code MOV AX,OFFSET FOO to make the
|
|||
|
error message go away.
|
|||
|
|
|||
|
~17 Divide Overflow~
|
|||
|
|
|||
|
This is reported when the right-hand side to a division or MOD
|
|||
|
operation is zero, or when the result of a division by a large
|
|||
|
(>64K) number is still large.
|
|||
|
|
|||
|
~18 Same Type Required~
|
|||
|
|
|||
|
This is reported when the two operands to a relational
|
|||
|
operator (EQ, NE, GT, GE, LT, or LE) are of different types.
|
|||
|
The operands to a relational operator ought to be both
|
|||
|
absolute integer constants, or labels in the same segment.
|
|||
|
|
|||
|
~19 CS Destination Not Allowed~
|
|||
|
|
|||
|
This is reported if you attempt to specify CS as the
|
|||
|
destination (first) operand to MOV, or as an operand to POP.
|
|||
|
The only acceptable way to load CS on the 8086 is via a far
|
|||
|
JMP, CALL, RETF, or IRET instruction. The MOV and POP forms
|
|||
|
don't make much sense, so they were outlawed by Intel.
|
|||
|
|
|||
|
~20 Left Operand Not Allowed~
|
|||
|
|
|||
|
This is reported if you have a left-hand side to an expression
|
|||
|
operator that expects only a single operand to its right.
|
|||
|
Those operators are BIT, NOT, OFFSET, TYPE, LOW, HIGH, SHORT,
|
|||
|
LONG, and INT. (The mnemonic INT is considered an operator
|
|||
|
e.g., in MSDOS EQU INT 33.) For example, you would get this
|
|||
|
error for the expression 1 NOT 2.
|
|||
|
|
|||
|
~21 Bad Single Operand~
|
|||
|
14-5
|
|||
|
|
|||
|
This is reported if the operand is inappropriate for an
|
|||
|
instruction INC, DEC, PUSH, POP, NOT, NEG, MUL, IMUL, DIV, or
|
|||
|
IDIV, that takes a single operand. You should look up the
|
|||
|
instruction in the chart in Chapter 6, to determine the proper
|
|||
|
operand forms allowed.
|
|||
|
|
|||
|
~22 Bad DUP Usage~
|
|||
|
|
|||
|
This is reported when a DUP construct occurs out of context
|
|||
|
(e.g. in an instruction operand instead of a data
|
|||
|
initialization); when the total number of bytes generated
|
|||
|
would push the output pointer beyond 64K; or when there is
|
|||
|
improper syntax for a DUP. See Chapter 9 for the description
|
|||
|
of correct DUP usage.
|
|||
|
|
|||
|
~23 Number Too Large~
|
|||
|
|
|||
|
This is reported when a numeric constant is too large for the
|
|||
|
assembler to store in its operand buffers-- the limit for
|
|||
|
integers is 2**80-1 = 1208925819614629174706175 decimal. The
|
|||
|
error is also given when the exponent part of a floating point
|
|||
|
constant is greater than 65535 in magnitude.
|
|||
|
|
|||
|
~24 SEGMENT or ENDS Required~
|
|||
|
|
|||
|
This is reported if a line beginning with one of the two A86
|
|||
|
keywords CODE or DATA does not continue with one of the
|
|||
|
keywords SEGMENT or ENDS. If you meant CODE or DATA to be a
|
|||
|
symbol you define, you have to change the name to something
|
|||
|
else, like _CODE or _DATA.
|
|||
|
|
|||
|
~25 Bad CALL/JMP Operand~
|
|||
|
|
|||
|
This is reported if the operand to a call or jump instruction
|
|||
|
cannot be taken as a jump destination. This occurs if the
|
|||
|
operand is missing, or if it has a size inappropriate for
|
|||
|
address pointers: byte, quadword, or ten-byte. The error also
|
|||
|
occurs if the operand is a constant number, and you are
|
|||
|
assembling to an OBJ format. In OBJ format anything jumped to
|
|||
|
within a segment must be specified as a label within some
|
|||
|
segment.
|
|||
|
|
|||
|
~26 Memory Doubleword Required~
|
|||
|
|
|||
|
This is reported if the second operand to an LDS, LES, or
|
|||
|
BOUND instruction is of the wrong type. The operand should be
|
|||
|
a doubleword memory quantity; but A86 will accept a word
|
|||
|
memory variable or a memory variable of unspecified size.
|
|||
|
|
|||
|
~27 Bad IN/OUT Operand~
|
|||
|
|
|||
|
This is reported when the operands to IN or OUT do not have
|
|||
|
the correct form. See Chapter 6 for the limited set of forms
|
|||
|
for these instructions. One of the operands must be AL or AX;
|
|||
|
the other must be DX or a constant between 0 and 255.
|
|||
|
|
|||
|
~28 type Required~
|
|||
|
14-6
|
|||
|
|
|||
|
This is reported when a symbol given in an EXTRN list is not
|
|||
|
followed one of the type names B, W, D, Q, T, F, NEAR, or ABS.
|
|||
|
The more verbose synonyms BYTE, WORD, DWORD, QWORD, and TBYTE
|
|||
|
are also acceptable.
|
|||
|
|
|||
|
~29 Bad Rotate/Shift Operand~
|
|||
|
|
|||
|
This is reported when the count (second) operand to a rotate
|
|||
|
or shift instruction is not appropriate: it should be either
|
|||
|
the name CL or a constant less than 32. The instructions
|
|||
|
requiring this are ROL, ROR, RCL, RCR, SHL, SHR, SAL, SAR, and
|
|||
|
the NEC-specific instructions SETBIT, TESTBIT, CLRBIT, and
|
|||
|
NOTBIT.
|
|||
|
|
|||
|
~30 Byte-Sized Constant Required~
|
|||
|
|
|||
|
This is reported in contexts where only a byte-sized absolute
|
|||
|
constant is acceptable. Those contexts are: the operand to a
|
|||
|
BIT or INT operator in an expression; the required operand to
|
|||
|
an INT or CALL80 instruction; the optional operand to an AAM
|
|||
|
or AAD instruction.
|
|||
|
|
|||
|
~31 Instruction In Data Segment Not Allowed~
|
|||
|
|
|||
|
There are only a limited number of directives allowed with a
|
|||
|
STRUC or a DATA segment. This error is reported when any
|
|||
|
instructions or disallowed directives are seen in one of these
|
|||
|
restricted environments. You have possibly neglected to
|
|||
|
provide an ENDS directive, returning you to normal assembly.
|
|||
|
In a STRUC, the only directives allowed are DB, DW, DD, DQ,
|
|||
|
DT, another STRUC, ENDS, EQU, SEGMENT, GROUP, MACRO, LABEL,
|
|||
|
EVEN, and ORG. The DATA segment allows the same directives,
|
|||
|
plus PROC, ENDP, DATA, and CODE.
|
|||
|
|
|||
|
~32 Bad String~
|
|||
|
|
|||
|
This is reported when you start a quoted string, and do not
|
|||
|
provide the closing quote in the same line. You might have
|
|||
|
left it out; or you might not have intended to code a string
|
|||
|
at all, and accidentally inserted a single- or double-quote
|
|||
|
mark in your line. Or you might have intended a string
|
|||
|
containing an end-of-line, which isn't allowed. You must
|
|||
|
instead close the string and code hex bytes 0D,0A to represent
|
|||
|
an end-of-line.
|
|||
|
|
|||
|
~33 Bad Data Operand~
|
|||
|
|
|||
|
This is reported if an inappropriate operand is seen in a data
|
|||
|
initialization (DB, DW, DD, DQ, or DT) directive. Examples of
|
|||
|
this are indexed quantities such as [BX], non-byte quantities
|
|||
|
in a DB, or floating point constants in a DB or DW.
|
|||
|
|
|||
|
~34 Index Brackets Required~
|
|||
|
14-7
|
|||
|
|
|||
|
This is reported if the name of a register is given in an
|
|||
|
addition/combination operation, but the register is not
|
|||
|
enclosed in square brackets. The only registers that may be
|
|||
|
added are those presented as indexing registers. For example,
|
|||
|
don't code BX+2, code [BX+2].
|
|||
|
|
|||
|
~35 Bad Character~
|
|||
|
|
|||
|
This is reported when a punctuation mark or other non-standard
|
|||
|
character is seen where it is not expected. The characters
|
|||
|
causing this error at the beginning of a line are digits, and
|
|||
|
the marks / - , + * ( ) & " ! -- other illegal marks at
|
|||
|
the start of a line cause error 6, Symbol Required. The
|
|||
|
characters causing this error elsewhere (i.e. within operands)
|
|||
|
are all characters except letters, digits, and the marks [ ] +
|
|||
|
- ' " > ( ) * . / :
|
|||
|
|
|||
|
~36 String > 2 Not Allowed~
|
|||
|
|
|||
|
This is reported when a string with 3 or more characters is
|
|||
|
seen outside of the places where such a string is allowed (in
|
|||
|
a DB directive, macro operand, or relocatable SEGMENT
|
|||
|
directive). One- and two-character strings are treated as
|
|||
|
simple numeric constants; but longer strings require special
|
|||
|
handling and are allowed only in the places mentioned.
|
|||
|
|
|||
|
~37 Misplaced Built-In Symbol~
|
|||
|
|
|||
|
The symbol just before this error message is an A86 built-in
|
|||
|
symbol, that is in a place where it doesn't belong. Examples
|
|||
|
of this are: mnemonics such as MOV occurring in operands; and
|
|||
|
symbols that aren't mnemonics such as LT occurring at the
|
|||
|
start of the line. If you thought you could define the symbol
|
|||
|
to the left of this message for your own use, you were wrong.
|
|||
|
You need to change the symbol to something else: TEST to
|
|||
|
_TEST, for example. If you'd like to know the built-in
|
|||
|
meaning of the symbol, you can look it up in Chapter 16.
|
|||
|
|
|||
|
~38 Segment Combination Not Allowed~
|
|||
|
|
|||
|
This is reported when you attempt to add or combine a segment
|
|||
|
or group name with another quantity. A86 currently doesn't
|
|||
|
allow this.
|
|||
|
|
|||
|
~39 Bad Index Register~
|
|||
|
|
|||
|
This is reported when you attempt to use a register other than
|
|||
|
SI, DI, BX, or BP for indexing. Those are the only registers
|
|||
|
that the 86 architecture allows you to place inside brackets,
|
|||
|
to address memory.
|
|||
|
|
|||
|
~40 Conflicting Multiple Definition Not Allowed~
|
|||
|
14-8
|
|||
|
|
|||
|
This is reported when you define a symbol in two places in
|
|||
|
your program, and the definitions aren't the same. Most often
|
|||
|
you have simply forgotten you already had a symbol somewhere
|
|||
|
of the same name, and you need to change the name of one of
|
|||
|
the two symbols you've defined. A86 allows the re-use of a
|
|||
|
symbol if it is a generic local label (a letter followed by
|
|||
|
one or more digits), or if is defined with = instead of EQU.
|
|||
|
A86 also allows the redefinition of a symbol if it has exactly
|
|||
|
the same value (e.g. ESC EQU 01B in two places in your
|
|||
|
program). See the section "Duplicate Definitions" in Chapter
|
|||
|
9 for a detailed discussion of this feature.
|
|||
|
|
|||
|
~41 ENDS Has No Segment~
|
|||
|
|
|||
|
This error occurs when A86 is assembling to an OBJ file, and
|
|||
|
it sees an ENDS at the outermost level of segments-- the ENDS
|
|||
|
has not been preceded by a matching SEGMENT directive. You
|
|||
|
need to look over your SEGMENT and ENDS directives, to get
|
|||
|
them to match up properly.
|
|||
|
|
|||
|
~42 Bad IF Operand~
|
|||
|
|
|||
|
This is reported when an IF is not followed by one of the
|
|||
|
flag-mnemonics (e.g., E, Z, NC, AE, etc.) that follow "J" in a
|
|||
|
conditional jump instruction. Most likely the line is a
|
|||
|
conditional assembly line intended for another assembler. In
|
|||
|
A86, conditional assembly lines begin with a hash sign #. So
|
|||
|
you change IF, ELSE, ENDIF to #IF, #ELSE, #ENDIF. You may
|
|||
|
also need to change the condition following IF: IF FOO EQU 0
|
|||
|
becomes #IF !FOO; IFDEF FOO becomes simply #IF FOO. IF
|
|||
|
(expression) must be replaced by the two lines C1 EQU
|
|||
|
(expression) followed by #IF C1 . See Chapter 11 for the
|
|||
|
details of A86's syntax for conditional assembly. See Chapter
|
|||
|
5 for the way A86 uses IF when it doesn't have a hash sign #.
|
|||
|
|
|||
|
~43 Parenthesis/Bracket Mismatch~
|
|||
|
|
|||
|
This is reported when there is a lack of balance of
|
|||
|
parentheses ( ) or brackets [ ] in an operand expression--
|
|||
|
there are too many left-sides, too many right-sides, or the
|
|||
|
brackets are interleaved illegally: ( [ ) ]. Most likely you
|
|||
|
have left out an opening or closing parenthesis/bracket in a
|
|||
|
complicated expression; or a spurious extra ( ) [ or ] has
|
|||
|
crept into your code.
|
|||
|
|
|||
|
~44 Bad Forward Reference Combination~
|
|||
|
|
|||
|
This is reported when you try to use forward references in
|
|||
|
expressions that are too complicated for A86 to handle. You
|
|||
|
can add or subtract constants from forward-referenced symbols;
|
|||
|
but you can't subtract a forward-referenced symbol from
|
|||
|
anything, and you can't add two forward references together.
|
|||
|
You can typically get around restrictions in forward reference
|
|||
|
expressions by moving the expression down to an EQU directive
|
|||
|
after the point that the symbols are defined, and making a
|
|||
|
forward reference to the EQUated symbol that represents the
|
|||
|
evaluated expression.
|
|||
|
14-9
|
|||
|
|
|||
|
This error is also reported in some situations involving
|
|||
|
relocatable symbols in OBJ mode -- these symbols are forward
|
|||
|
references in the sense that they are resolved only at link
|
|||
|
time.
|
|||
|
|
|||
|
~45 Is It Byte Or Word?~
|
|||
|
|
|||
|
This is reported when you have a memory operand of unspecified
|
|||
|
size, and A86 needs to know whether the operand is byte-sized
|
|||
|
or word-sized, in order to generate the correct instruction
|
|||
|
form. All you need to do is to append a B or a W to the
|
|||
|
operand, to specify the size you want. For example, if you've
|
|||
|
coded INC [BX], you need to decide between INC B[BX] and INC
|
|||
|
W[BX]. If you've coded ADD FOO,4 where FOO is a forward
|
|||
|
reference, you need to specify ADD FOO B,4 or ADD FOO W,4 .
|
|||
|
|
|||
|
~46 Bad #-Construct~
|
|||
|
|
|||
|
This is reported if, within a macro definition, a # is seen
|
|||
|
that is not followed by one of the allowed macro parameter
|
|||
|
constructs described in Chapter 11. Even in quoted strings,
|
|||
|
the hash sign # must be literalized via ## if it is to be
|
|||
|
taken as-is.
|
|||
|
|
|||
|
If you mistakenly provide a macro-loop variable (#W, #X, #Y,
|
|||
|
or #Z) outside of any loop defining that variable, this error
|
|||
|
is detected when the macro is expanded, even though the error
|
|||
|
is in the macro definition.
|
|||
|
|
|||
|
The error is also reported if # occurs at the beginning of a
|
|||
|
line, and is not followed by IF, ELSEIF, ELSE, or ENDIF; or if
|
|||
|
a conditional assembly parameter is a built-in mnemonic e.g.
|
|||
|
#IF MOV . See Chapter 11 for the correct usage of the hash
|
|||
|
sign in both macros and conditional assembly.
|
|||
|
|
|||
|
~47 #ENDIF Required~
|
|||
|
|
|||
|
This is reported if you have an #IF without a corresponding
|
|||
|
#ENDIF before the end of the file (or the end of the macro
|
|||
|
expansion if the #IF was assembled during a macro expansion).
|
|||
|
When this message appears at the end of a file, you need to
|
|||
|
search backwards for #IFs, to find the unclosed block.
|
|||
|
|
|||
|
~48 #EM Required To End Macro~
|
|||
|
|
|||
|
This is reported if you have a MACRO without an end. In A86,
|
|||
|
the end of a macro is given by #EM. Most likely your file was
|
|||
|
written for another assembler, and you need to convert macro
|
|||
|
definitions. You need to change all ENDM directives to #EM.
|
|||
|
You also need to eliminate the named parameters from the MACRO
|
|||
|
line, and replace occurrences of the named parameters with #1,
|
|||
|
#2, #3, etc. The & concatenation operator can be dropped. See
|
|||
|
Chapter 11 for a full description of A86's macro syntax.
|
|||
|
|
|||
|
~49 End Delimiter to COMMENT Required~
|
|||
|
14-10
|
|||
|
|
|||
|
This is reported when the portion of code skipped in a COMMENT
|
|||
|
directive has run to the end of the file, without the closing
|
|||
|
delimiter being found. You need to search backwards from the
|
|||
|
end of the file to find the COMMENT directive, figure out
|
|||
|
where you intend the directive to end, and duplicate the
|
|||
|
delimiter (the first non-blank following COMMENT) at that
|
|||
|
end-point. See Chapter 4 for a full description of the
|
|||
|
COMMENT directive.
|
|||
|
|
|||
|
~50 Reg,Mem Required~
|
|||
|
|
|||
|
This is reported when you have an improper combination of
|
|||
|
operands for a MOV, XCHG, or general arithmetic instruction
|
|||
|
such as ADD, SUB, CMP, XOR, etc. Most often you have
|
|||
|
attempted to provide two memory operands: MOV VAR1,VAR2 or ADD
|
|||
|
VAR1,VAR2. One of the operands must be a register. You can
|
|||
|
effect the memory-to-memory operation by using a register in a
|
|||
|
two-instruction sequence; for example, MOV AX,VAR2 followed by
|
|||
|
ADD VAR1,AX . For convenience, A86 lets you code the sequence
|
|||
|
with the single line ADD VAR1,AX,VAR2.
|
|||
|
|
|||
|
If you don't wish to clobber the contents of any registers,
|
|||
|
and the operands are word-sized, you may PUSH the source
|
|||
|
operand and then POP to the destination operand: PUSH VAR2
|
|||
|
followed by POP VAR1.
|
|||
|
|
|||
|
~51 Segment Override Not Allowed Here~
|
|||
|
|
|||
|
For compatibility with other assemblers, A86 allows segment
|
|||
|
override operators CS:, DS:, ES:, or SS: within expressions in
|
|||
|
instruction operands. The override informs the assembler that
|
|||
|
the named segment register is to be used for the memory
|
|||
|
reference, so that the assembler might generate a segment
|
|||
|
override opcode byte. This error is reported when a segment
|
|||
|
override operator occurs out of context: in A86's special
|
|||
|
three-operand form for MOV or arithmetic instructions; within
|
|||
|
a DATA segment or STRUC, or in an EQU directive. You might
|
|||
|
encounter the last case if you're porting a program written
|
|||
|
for another assembler. If so, you might have to provide
|
|||
|
explicit overrides wherever the EQUated symbol is used. It's
|
|||
|
possible, though, that the override is provided only to
|
|||
|
satisfy the other assembler's segment checking mechanism, and
|
|||
|
no overrides are generated at all. In that case, you can just
|
|||
|
eliminate the override operator.
|
|||
|
|
|||
|
~52 Byte Operand Required~
|
|||
|
|
|||
|
This is reported when an operand to one of the NEC-specific
|
|||
|
instructions STOBITS, LODBITS, ROL4, ROR4 is of the wrong
|
|||
|
type. STOBITS and LODBITS require the first operand to be a
|
|||
|
byte-sized register and the second operand to be either a
|
|||
|
byte-sized register or an immediate constant. ROL4 and ROR4
|
|||
|
require the only operand to be a byte-sized register.
|
|||
|
|
|||
|
~53 Word Register Required~
|
|||
|
14-11
|
|||
|
|
|||
|
This is reported when the first operand to any of the
|
|||
|
instructions LDS, LES, LEA, BOUND, IMUL, LAR, or LSL is not a
|
|||
|
word-sized general register (AX,BX,CX,DX,SI,DI,BP, or SP).
|
|||
|
|
|||
|
~54 Floating-Point Chip Required~
|
|||
|
|
|||
|
This is reported when you attempt to assemble a program with
|
|||
|
floating point constants or floating point expressions, and
|
|||
|
you do not have a floating point chip (8087 or 287) in your
|
|||
|
computer system. A86 uses the 87 to assemble constants and do
|
|||
|
arithmetic. It's time for you to buy a chip and install it in
|
|||
|
that empty socket!
|
|||
|
|
|||
|
~55 Bad Floating-Point Operand~
|
|||
|
|
|||
|
This is reported when an operand to a floating point
|
|||
|
instruction is not of the correct type. See Chapter 7 for the
|
|||
|
correct forms for the instruction you're coding. Some
|
|||
|
possibilities for the error are:
|
|||
|
|
|||
|
* a memory operand has unspecified size, or a size not
|
|||
|
compatible with the instruction. Integer instructions
|
|||
|
(FIxxx) require a W or D operand; floating arithmetic
|
|||
|
instructions require a D or Q operand.
|
|||
|
|
|||
|
* you've tried to specify an 86 register instead of a memory
|
|||
|
operand.
|
|||
|
|
|||
|
* you've tried A86's special FLD (constant) form in OBJ mode.
|
|||
|
Sorry, I support this only for COM mode (mainly for D86).
|
|||
|
|
|||
|
* you've specified two register numbers (0 through 7), but
|
|||
|
neither is 0.
|
|||
|
|
|||
|
* you've tried one of the disallowed forms FCOM i,0 or FCOMP
|
|||
|
i,0
|
|||
|
|
|||
|
~56 Constant 0--7 Required~
|
|||
|
|
|||
|
This is reported if a constant number operand to an 87
|
|||
|
instruction, which is supposed to represent an 87 stack number
|
|||
|
(0 through 7), does not have the right value; i.e., it's not
|
|||
|
an integer, or it's not in the range 0 through 7.
|
|||
|
|
|||
|
~57 Memory Operand Required~
|
|||
|
|
|||
|
This is reported when an operand to a floating-point or a 286
|
|||
|
protected-mode instruction must be a memory operand, and the
|
|||
|
operand you've provided isn't one. See Chapters 7 (for
|
|||
|
floating) or 6 (for protected) for the correct syntax of the
|
|||
|
instruction you're coding.
|
|||
|
|
|||
|
~58 Segment Or Struc Name Not Allowed~
|
|||
|
14-12
|
|||
|
|
|||
|
This error occurs most often when you are attempting to
|
|||
|
assemble as a COM program a file intended to be an EXE
|
|||
|
program. The COM format does not allow you to refer to the
|
|||
|
value of a named segment, or to make a FAR pointer out of a
|
|||
|
label within the program. You should either use the +O option
|
|||
|
to produce an OBJ file, or simply eliminate the statements
|
|||
|
intended to set the segment registers-- COM programs are
|
|||
|
started with all segment registers already pointing to the
|
|||
|
same value.
|
|||
|
|
|||
|
This error is also reported when you provide the name of a
|
|||
|
structure, or the name of an INT equate, in a place where a
|
|||
|
register or memory operand is expected.
|
|||
|
|
|||
|
~59 Word Operand Required~
|
|||
|
|
|||
|
This is reported when something other than a word-sized
|
|||
|
operand is provided for one of the 286 instructions ARPL,
|
|||
|
SLDT, LLDT, STR, LTR, VERR, VERW, SMSW, or LMSW.
|
|||
|
|
|||
|
~60 Circular Definition Not Allowed~
|
|||
|
|
|||
|
This is reported when a chain of macro calls or references to
|
|||
|
undefined symbols reaches a depth of 1024. A86 assumes that
|
|||
|
it is in an infinite loop: for example, FOO EQU FOO; or BAZ
|
|||
|
MACRO containing an uncontrolled call to BAZ within itself.
|
|||
|
|
|||
|
|
|||
|
~61 Overlapping Local Not Allowed~
|
|||
|
|
|||
|
Recall from Chapter 5 that when you use a local label symbol
|
|||
|
twice, you must distinguish a reference to that symbol by
|
|||
|
prepending a > before the symbol's name if the reference is a
|
|||
|
forward reference. You get this error if you have followed
|
|||
|
such a forward reference with another reference, without the
|
|||
|
>, before the next incaration of the symbol is defined.
|
|||
|
There's a danger that you intended the reference to be to the
|
|||
|
previous incarnation, which A86 doesn't allow. Example:
|
|||
|
|
|||
|
L1: ; first incarnation of L1
|
|||
|
JNZ >L1 ; reference to second incarnation
|
|||
|
JMP L1 ; ERROR-- which incarnation are we referring to?
|
|||
|
L1: ; second incarnation of L1
|
|||
|
|
|||
|
If you intended the JMP to be to the second L1, you should
|
|||
|
prepend a > to the L1, just like the JNZ. If you intended the
|
|||
|
JMP to be to the first L1, you must change one of the two
|
|||
|
label names so that their ranges don't overlap.
|
|||
|
|
|||
|
~62 ORG Required in first DATA SEGMENT~
|
|||
|
14-13
|
|||
|
|
|||
|
Previous versions of A86 allowed a default starting offset of
|
|||
|
0 for the DATA SEGMENT. I hope in the future to change this
|
|||
|
default to the offset immediately following the program (if it
|
|||
|
is a COM file). As a transition, I am outlawing ORGless DATA
|
|||
|
segments, so if it was your intention to start at offset 0,
|
|||
|
you must now state so explicitly with an ORG 0 following the
|
|||
|
first DATA SEGMENT directive in your program.
|
|||
|
|
|||
|
~97 Object Overflow~
|
|||
|
|
|||
|
This is reported when the assembler runs out of room in its
|
|||
|
output object-code segment (which also holds records used to
|
|||
|
resolve forward references). This will happen only if your
|
|||
|
object output nears the object capacity, which is 64K if a
|
|||
|
full amount of memory (about 200K) is available to the
|
|||
|
assembler. If you have a limited amount of memory, you should
|
|||
|
increase the memory available to A86, by buying another board,
|
|||
|
or by having fewer memory-resident programs installed when you
|
|||
|
run A86. If you are assembling OBJ files, you can break the
|
|||
|
program into smaller assembled modules.
|
|||
|
|
|||
|
It's conceivable that this error could result in a D86
|
|||
|
session, when you are using patch-memory mode to type in an
|
|||
|
extremely complicated program. In that case, you should type
|
|||
|
the program into a text file instead, and use A86 to assemble
|
|||
|
the text file.
|
|||
|
|
|||
|
~98 Undefined Symbol Not Allowed~
|
|||
|
|
|||
|
This error should occur only during a D86 debugging session,
|
|||
|
when you type an immediate-execution assembly language line
|
|||
|
containing a symbol not in the table (typically a mistyping on
|
|||
|
your part). D86 allows you to add symbols to the table only
|
|||
|
when you are in patch-memory mode (reached by pressing the F7
|
|||
|
key).
|
|||
|
|
|||
|
~99 Symbol Table Overflow~
|
|||
|
|
|||
|
This is reported when the symbol table runs out of space. It's
|
|||
|
unlikely that you'll ever run into this error, since A86's
|
|||
|
capacity is thousands of symbols. If you do, you'll need to
|
|||
|
reduce the number of symbols in your program. One way to do
|
|||
|
so is to replace all place-marker symbols with local labels in
|
|||
|
a limited range (like L0--L9). See Chapter 5 for a
|
|||
|
description of A86's local label facility.
|
|||
|
|
|||
|
|