home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / sharew / a86 / asm_doc / a14.doc < prev    next >
Encoding:
Text File  |  1988-02-18  |  29.4 KB  |  675 lines

  1. CHAPTER 14   DESCRIPTIONS OF A86 ERROR MESSAGES
  2.  
  3.  
  4. ~01 Unknown Mnemonic~
  5.  
  6.    Most assembly-language lines start with an built-in
  7.    instruction mnemonic such as MOV or ADD.  The only
  8.    circumstances in which a line can start with non-built-in
  9.    symbol are if the symbol is a macro name or INT equate, or if
  10.    the symbol is now being defined, as indicated by a limited set
  11.    of following symbols: a colon, EQU, DB, DW, etc.  This line
  12.    started with a non-built-in symbol which did not fall into any
  13.    of the above categories.  You might have misspelled an
  14.    instruction mnemonic, or misspelled the following word.
  15.  
  16. ~02 Jump > 128~
  17.  
  18.    The destination operand of a conditional jump must be a label
  19.    within 128 bytes of the end of the instruction.  (Precisely,
  20.    from -128 to +127 from the next instruction, which is from
  21.    -126 to +129 from the start of the conditional jump.)   This
  22.    error is reported in three possible places:
  23.  
  24.     1. At the conditional jump.  The operand is more than 126
  25.        bytes before the jump, or the operand is not a label (e.g.
  26.        you tried an indirect conditional jump through a variable,
  27.        which isn't allowed)
  28.  
  29.     2. At a label definition.  In this case, you use your editor
  30.        to search backwards for references to the label.  One or
  31.        more of the earliest conditional jumps found are too far
  32.        away.
  33.  
  34.     3. At a RET, RETF, or IRET instruction.  You use your editor
  35.        to search backwards for that flavor of RET used as the
  36.        operand to a conditional jump (the A86 conditional return
  37.        feature). The earliest such jumps not satisfied by a
  38.        previous RET are too far away.
  39.  
  40.    You usually correct this error by rearranging your code, or
  41.    (better) by breaking intervening code off into subroutines. If
  42.    desperate, you can replace "Jcond" with "IF cond JMP".
  43.  
  44. ~03 [BX+BP] And [SI+DI] Not Allowed~
  45.  
  46.    The 86 instruction set does not support the combinations of
  47.    indexing registers indicated in the error message.  In
  48.    previous versions of A86, this error was reported in other
  49.    illegal operand combinations; I've attempted to change other
  50.    cases to error 14.  If you ever find otherwise, let me know.
  51.  
  52. ~04 Bad Character In Number~
  53.  
  54.    All numbers, and only numbers, start with a decimal digit.
  55.    (It's illegal to have a symbol begin with a digit; e.g.
  56.    01MYVAR .)   You have coded something that starts with a
  57.    decimal digit but does not have the correct format for a
  58.    numeric constant.  See Chapter 8 for detailed descriptions of
  59.    the formats of both integer and floating constants.
  60.                                                              14-2
  61.  
  62. ~05 Operands Not Allowed~
  63.  
  64.    When this error is reported it usually means that you have
  65.    provided something more than just the mnemonic for an
  66.    instruction that does not have any operands: e.g., PUSHF,
  67.    STOSB, STC, FLDPI, CLTS.  It's also called in other contexts
  68.    when the assembler expects nothing more on the line; e.g.,
  69.    NAME with more than just a single name following, or something
  70.    following the word ENDS.
  71.  
  72. ~06 Symbol Required~
  73.  
  74.    This is reported in numerous situations where A86 requires
  75.    some sort of symbol: either a built-in assembler mnemonic, or
  76.    a symbol you define.  (It's possible that a number or some
  77.    punctuation marks are legal in the context, and that they have
  78.    already been checked for.)  Instead of a symbol, a punctuation
  79.    mark or out-of-context number was seen.  The contexts in which
  80.    this error can occur include:
  81.  
  82.     * the start of a line (characters hex 3C or greater)
  83.  
  84.     * after the following at the start of a line: a symbol you
  85.        define, #, #IF, IF, CODE, or DATA
  86.  
  87.     * where operands to the following directives are expected:
  88.        NAME, PUBLIC, EXTRN, GROUP, SEGMENT
  89.  
  90.     * after ">" denoting a local-label forward reference
  91.  
  92. ~07 Local Symbol Required~
  93.  
  94.    This is reported when something other than a generic local
  95.    label (letter followed by one or more digits) follows a ">"
  96.    mark, which denotes a local-label forward reference.  If you
  97.    meant "greater than" you use the GT operator instead.
  98.  
  99. ~08 Too Many Operands~
  100.  
  101.    This is reported for instructions and directives requiring a
  102.    limited number of operands, for which the limit is exceeded.
  103.    Since operands are separated by commas, you have too many
  104.    commas-- possibly an extra comma between the mnemonic and
  105.    first operand, or at the end of the operands.
  106.  
  107. ~09 Constant Required~
  108.  
  109.    This is reported for instructions and directives (ENTER, RET,
  110.    RADIX, etc.) requiring operands that are an immediate constant
  111.    number; and for expression operators (*, /, SHL, OR, NOT, BY,
  112.    etc.) whose operands must be constant.  In some cases a
  113.    limited number of forms other than constants are acceptable,
  114.    but the assembler has already checked for and not found those
  115.    possibilities.
  116.  
  117. ~10 More Operands Required~
  118.                                                              14-3
  119.  
  120.    This is reported for instructions requiring two operands, for
  121.    which you have provided no operands or only one operand.  You
  122.    might have left out the comma separating the operands.
  123.  
  124. ~11 Constant/Label Not Allowed~
  125.  
  126.    This is reported when you have given a constant number in a
  127.    place where it isn't allowed-- usually as a destination
  128.    operand to an instruction, such as the first operand to a MOV
  129.    or ADD.  If you meant the operand to be the memory location
  130.    with the constant offset, you must convert the type by
  131.    enclosing the operand in brackets [ ] or appending a size-
  132.    specifier (B, W, D, Q, or T) to the number.
  133.  
  134. ~12 Segment Register Not Allowed~
  135.  
  136.    This is reported when you have used a segment register in an
  137.    instruction where it isn't allowed.  The only instructions
  138.    allowing segment registers as operands are MOV, PUSH, and POP.
  139.    You can't, for example, ADD into a segment register.  If you
  140.    want to do anything with a segment register value, you have to
  141.    MOV it into a general register, perform the operation, then
  142.    MOV the result back to the segment register.
  143.  
  144. ~13 Byte/Word Combination Not Allowed~
  145.  
  146.    This is reported in a two-byte instruction in which one
  147.    operand is byte-sized and the other word-sized; or in an
  148.    instruction with a byte-sized destination and an immediate
  149.    source whose value is not byte-sized (high byte not 0 or 0FF).
  150.    If one of the operands is a memory variable of the wrong size,
  151.    you either change the declaration of the variable (DB to DW or
  152.    vice versa) or override the size of the variable in this
  153.    instruction only, by appending a " B" or " W" to the memory
  154.    operand.
  155.  
  156. ~14 Bad Operand Combination~
  157.  
  158.    This is reported when you attempt to add or combine terms in
  159.    an operand expression that do not allow combination.  An
  160.    example of this would be DT 3.7+BX.  Only constants can be
  161.    added to floating point numbers.
  162.  
  163.    This is also reported when you have two operands that are
  164.    mismatched in size, and the mismatch is something other than
  165.    Byte vs. Word. Example: MOV AL,D[0100].
  166.  
  167. ~15 Bad Subtraction Operands~
  168.                                                              14-4
  169.  
  170.    This is reported when you attempt to subtract terms in an
  171.    operand expression that do not allow subtraction, or if the
  172.    right-hand side to a subtraction is missing.  If the right-
  173.    hand side to a subtraction is a non-forward-referenced
  174.    constant, then the left side can be almost anything.
  175.    Otherwise, the operands must match; e.g., labels from
  176.    relocatable segments must be in the same segment (in which
  177.    case the answer is an absolute constant; namely, the size of
  178.    the block of memory between the two labels).
  179.  
  180. ~16 Definition Conflicts With Forward Reference~
  181.  
  182.    This error occurs when the assembler has previously guessed
  183.    the type of a forward-referenced symbol in order to determine
  184.    what kind of instruction to generate, and the guess turned out
  185.    to be wrong.  The error is reported at the time the symbol is
  186.    defined.  For example, when A86 sees MOV AX,FOO, it will
  187.    assume FOO is an immediate value.  This error is reported if
  188.    FOO turns out to be a word variable: FOO DW 0.  You need to
  189.    search backwards from the error message, to references of FOO,
  190.    and specify the type you intend to be used: MOV AX,FOO W.  If
  191.    you really did intend to load the offset of FOO and not the
  192.    memory contents, you can code MOV AX,OFFSET FOO to make the
  193.    error message go away.
  194.  
  195. ~17 Divide Overflow~
  196.  
  197.    This is reported when the right-hand side to a division or MOD
  198.    operation is zero, or when the result of a division by a large
  199.    (>64K) number is still large.
  200.  
  201. ~18 Same Type Required~
  202.  
  203.    This is reported when the two operands to a relational
  204.    operator (EQ, NE, GT, GE, LT, or LE) are of different types.
  205.    The operands to a relational operator ought to be both
  206.    absolute integer constants, or labels in the same segment.
  207.  
  208. ~19 CS Destination Not Allowed~
  209.  
  210.    This is reported if you attempt to specify CS as the
  211.    destination (first) operand to MOV, or as an operand to POP.
  212.    The only acceptable way to load CS on the 8086 is via a far
  213.    JMP, CALL, RETF, or IRET instruction.  The MOV and POP forms
  214.    don't make much sense, so they were outlawed by Intel.
  215.  
  216. ~20 Left Operand Not Allowed~
  217.  
  218.    This is reported if you have a left-hand side to an expression
  219.    operator that expects only a single operand to its right.
  220.    Those operators are BIT, NOT, OFFSET, TYPE, LOW, HIGH, SHORT,
  221.    LONG, and INT.  (The mnemonic INT is considered an operator
  222.    e.g., in MSDOS EQU INT 33.)  For example, you would get this
  223.    error for the expression 1 NOT 2.
  224.  
  225. ~21 Bad Single Operand~
  226.                                                              14-5
  227.  
  228.    This is reported if the operand is inappropriate for an
  229.    instruction INC, DEC, PUSH, POP, NOT, NEG, MUL, IMUL, DIV, or
  230.    IDIV, that takes a single operand.  You should look up the
  231.    instruction in the chart in Chapter 6, to determine the proper
  232.    operand forms allowed.
  233.  
  234. ~22 Bad DUP Usage~
  235.  
  236.    This is reported when a DUP construct occurs out of context
  237.    (e.g. in an instruction operand instead of a data
  238.    initialization); when the total number of bytes generated
  239.    would push the output pointer beyond 64K; or when there is
  240.    improper syntax for a DUP.  See Chapter 9 for the description
  241.    of correct DUP usage.
  242.  
  243. ~23 Number Too Large~
  244.  
  245.    This is reported when a numeric constant is too large for the
  246.    assembler to store in its operand buffers-- the limit for
  247.    integers is 2**80-1 = 1208925819614629174706175 decimal. The
  248.    error is also given when the exponent part of a floating point
  249.    constant is greater than 65535 in magnitude.
  250.  
  251. ~24 SEGMENT or ENDS Required~
  252.  
  253.    This is reported if a line beginning with one of the two A86
  254.    keywords CODE or DATA does not continue with one of the
  255.    keywords SEGMENT or ENDS.  If you meant CODE or DATA to be a
  256.    symbol you define, you have to change the name to something
  257.    else, like _CODE or _DATA.
  258.  
  259. ~25 Bad CALL/JMP Operand~
  260.  
  261.    This is reported if the operand to a call or jump instruction
  262.    is cannot be taken as a jump destination.  This occurs if the
  263.    operand is missing, if it has a size inappropriate for address
  264.    pointers: byte, quadword, or ten-byte.  The error also occurs
  265.    if the operand is a constant number, and you are assembling to
  266.    an OBJ format.  In OBJ format anything jumped to within a
  267.    segment must be specified as a label within some segment.
  268.  
  269. ~26 Memory Doubleword Required~
  270.  
  271.    This is reported if the second operand to an LDS, LES, or
  272.    BOUND instruction is of the wrong type.  The operand should be
  273.    a doubleword memory quantity; but A86 will accept a word
  274.    memory variable or a memory variable of unspecified size.
  275.  
  276. ~27 Bad IN/OUT Operand~
  277.  
  278.    This is reported when the operands to IN or OUT do not have
  279.    the correct form.  See Chapter 6 for the limited set of forms
  280.    for these instructions.  One of the operands must be AL or AX;
  281.    the other must be DX or a constant between 0 and 255.
  282.  
  283. ~28 :type Required~
  284.                                                              14-6
  285.  
  286.    This is reported when a symbol given in an EXTRN list is not
  287.    followed by a colon followed by one of the type names B, W, D,
  288.    Q, T, F, NEAR, or ABS.  The more verbose synonyms BYTE, WORD,
  289.    DWORD, QWORD, and TBYTE are also acceptable.
  290.  
  291. ~29 Bad Rotate/Shift Operand~
  292.  
  293.    This is reported when the count (second) operand to a rotate
  294.    or shift instruction is not appropriate: it should be either
  295.    the name CL or a constant less than 32.  The instructions
  296.    requiring this are ROL, ROR, RCL, RCR, SHL, SHR, SAL, SAR, and
  297.    the NEC-specific instructions SETBIT, TESTBIT, CLRBIT, and
  298.    NOTBIT.
  299.  
  300. ~30 Byte-Sized Constant Required~
  301.  
  302.    This is reported in contexts where only a byte-sized absolute
  303.    constant is acceptable.  Those contexts are: the operand to a
  304.    BIT or INT operator in an expression; the required operand to
  305.    an INT or CALL80 instruction; the optional operand to an AAM
  306.    or AAD instruction.
  307.  
  308. ~31 Instruction In Data Segment Not Allowed~
  309.  
  310.    There are only a limited number of directives allowed with a
  311.    STRUC or a DATA segment.  This error is reported when any
  312.    instructions or disallowed directives are seen in one of these
  313.    restricted environments.  You have possibly neglected to
  314.    provide an ENDS directive, returning you to normal assembly.
  315.    In a STRUC, the only directives allowed are DB, DW, DD, DQ,
  316.    DT, another STRUC, ENDS, EQU, SEGMENT, GROUP, MACRO, LABEL,
  317.    EVEN, and ORG.  The DATA segment allows the same directives,
  318.    plus PROC, ENDP, DATA, and CODE.
  319.  
  320. ~32 Bad String~
  321.  
  322.    This is reported when you start a quoted string, and do not
  323.    provide the closing quote in the same line.  You might have
  324.    left it out; or you might not have intended to code a string
  325.    at all, and accidentally inserted a single- or double-quote
  326.    mark in your line.  Or you might have intended a string
  327.    containing an end-of-line, which isn't allowed.  You must
  328.    instead close the string and code hex bytes 0D,0A to represent
  329.    an end-of-line.
  330.  
  331. ~33 Bad Data Operand~
  332.  
  333.    This is reported if an inappropriate operand is seen in a data
  334.    initialization (DB, DW, DD, DQ, or DT) directive.  Example of
  335.    this are indexed quantities such as [BX], non-byte quantities
  336.    in a DB, or floating point constants in a DB or DW.
  337.  
  338. ~34 Index Brackets Required~
  339.                                                              14-7
  340.  
  341.    This is reported if the name of a register is given in an
  342.    addition/combination operation, but the register is not
  343.    enclosed in square brackets.  The only registers that may be
  344.    added are those presented as indexing registers.  For example,
  345.    don't code BX+2, code [BX+2].
  346.  
  347. ~35 Bad Character~
  348.  
  349.    This is reported when a punctuation mark or other non-standard
  350.    character is seen where it is not expected.  The characters
  351.    causing this error at the beginning of a line are digits, and
  352.    the marks  / - , + * ( ) & " !   --  other illegal marks at
  353.    the start of a line cause error 6, Symbol Required.  The
  354.    characters causing this error elsewhere (i.e. within operands)
  355.    are all characters except letters, digits, and the marks [ ] +
  356.    - ' " > ( ) * . / :
  357.  
  358. ~36 String > 2 Not Allowed~
  359.  
  360.    This is reported when a string with 3 or more characters is
  361.    seen outside of the places where such a string is allowed (in
  362.    a DB directive, macro operand, or relocatable SEGMENT
  363.    directive).  One- and two-character strings are treated as
  364.    simple numeric constants; but longer strings require special
  365.    handling and are allowed only in the places mentioned.
  366.  
  367. ~37 Misplaced Built-In Symbol~
  368.  
  369.    The symbol just before this error message is an A86 built-in
  370.    symbol, that is in a place where it doesn't belong.  Examples
  371.    of this are: mnemonics such as MOV occurring in operands; and
  372.    symbols that aren't mnemonics such as LT occurring at the
  373.    start of the line.  If you thought you could define the symbol
  374.    to the left of this message for your own use, you were wrong.
  375.    You need to change the symbol to something else: TEST to
  376.    _TEST, for example.  If you'd like to know the built-in
  377.    meaning of the symbol, you can look it up in Chapter 16.
  378.  
  379. ~38 Segment Combination Not Allowed~
  380.  
  381.    This is reported when you attempt to add or combine a segment
  382.    or group name with another quantity.  A86 currently doesn't
  383.    allow this.
  384.  
  385. ~39 Bad Index Register~
  386.  
  387.    This is reported when you attempt to use a register other than
  388.    SI, DI, BX, or BP for indexing.  Those are the only registers
  389.    that the 86 architecture allows you to place inside brackets,
  390.    to address memory.
  391.  
  392. ~40 Conflicting Multiple Definition Not Allowed~
  393.                                                              14-8
  394.  
  395.    This is reported when you define a symbol in two places in
  396.    your program, and the definitions aren't the same.  Most often
  397.    you have simply forgotten you already had a symbol somewhere
  398.    of the same name, and you need to change the name of one of
  399.    the two symbols you've defined.  A86 allows the re-use of a
  400.    symbol if it is a generic local label (a letter followed by
  401.    one or more digits), or if is defined with = instead of EQU.
  402.    A86 also allows the redefinition of a symbol if it has exactly
  403.    the same value (e.g. ESC EQU 01B in two places in your
  404.    program).  See the section "Duplicate Definitions" in Chapter
  405.    9 for a detailed discussion of this feature.
  406.  
  407. ~41 ENDS Has No Segment~
  408.  
  409.    This error occurs when A86 is assembling to an OBJ file, and
  410.    it sees an ENDS at the outermost level of segments-- the ENDS
  411.    has not been preceded by a matching SEGMENT directive.  You
  412.    need to look over your SEGMENT and ENDS directives, to get
  413.    them to match up properly.
  414.  
  415. ~42 Bad IF Operand~
  416.  
  417.    This is reported when an IF is not followed by one of the
  418.    flag-mnemonics (e.g., E, Z, NC, AE, etc.) that follow "J" in a
  419.    conditional jump instruction.  Most likely the line is a
  420.    conditional assembly line intended for another assembler.  In
  421.    A86, conditional assembly lines begin with a hash sign #.  So
  422.    you change IF, ELSE, ENDIF to #IF, #ELSE, #ENDIF.  You may
  423.    also need to change the condition following IF: IF FOO EQU 0
  424.    becomes #IF !FOO; IFDEF FOO becomes simply #IF FOO. IF
  425.    (expression) must be replaced by the two lines C1 EQU
  426.    (expression) followed by #IF C1 .  See Chapter 11 for the
  427.    details of A86's syntax for conditional assembly.  See Chapter
  428.    5 for the way A86 uses IF when it doesn't have a hash sign #.
  429.  
  430. ~43 Parenthesis/Bracket Mismatch~
  431.  
  432.    This is reported when there is a lack of balance of
  433.    parentheses ( ) or brackets [ ] in an operand expression--
  434.    there are too many left-sides, too many right-sides, or the
  435.    brackets are interleaved illegally: ( [ ) ].  Most likely you
  436.    have left out an opening or closing parenthesis/bracket in a
  437.    complicated expression; or a spurious extra ( ) [ or ] has
  438.    crept into your code.
  439.  
  440. ~44 Bad Forward Reference Combination~
  441.  
  442.    This is reported when you try to use forward references in
  443.    expressions that are too complicated for A86 to handle.  You
  444.    can add or subtract constants from forward-referenced symbols;
  445.    but you can't subtract a forward-referenced symbol from
  446.    anything, and you can't add two forward references together.
  447.    You can typically get around restrictions in forward reference
  448.    expressions by moving the expression down to an EQU directive
  449.    after the point that the symbols are defined, and making a
  450.    forward reference to the EQUated symbol that represents the
  451.    evaluated expression.
  452.                                                              14-9
  453.  
  454.    This error is also reported in some situations involving
  455.    relocatable symbols in OBJ mode -- these symbols are forward
  456.    references in the sense that they are resolved only at link
  457.    time.
  458.  
  459. ~45 Is It Byte Or Word?~
  460.  
  461.    This is reported when you have a memory operand of unspecified
  462.    size, and A86 needs to know whether the operand is byte-sized
  463.    or word-sized, in order to generate the correct instruction
  464.    form.  All you need to do is to append a B or a W to the
  465.    operand, to specify the size you want.  For example, if you've
  466.    coded INC [BX], you need to decide between INC B[BX] and INC
  467.    W[BX].  If you've coded ADD FOO,4 where FOO is a forward
  468.    reference, you need to specify ADD FOO B,4 or ADD FOO W,4 .
  469.  
  470. ~46 Bad #-Construct~
  471.  
  472.    This is reported if, within a macro definition, a # is seen
  473.    that is not followed by one of the allowed macro parameter
  474.    constructs described in Chapter 11.  Even in quoted strings,
  475.    the hash sign # must be literalized via ## if it is to be
  476.    taken as-is.
  477.  
  478.    The error is also reported if # occurs at the beginning of a
  479.    line, and is not followed by IF, ELSEIF, ELSE, or ENDIF; or if
  480.    a conditional assembly parameter is a built-in mnemonic e.g.
  481.    #IF MOV .  See Chapter 11 for the correct usage of the hash
  482.    sign in both macros and conditional assembly.
  483.  
  484. ~47 #ENDIF Required~
  485.  
  486.    This is reported if you have an #IF without a corresponding
  487.    #ENDIF before the end of the file (or the end of the macro
  488.    expansion if the #IF was assembled during a macro expansion).
  489.    When this message appears at the end of a file, you need to
  490.    search backwards for #IFs, to find the unclosed block.
  491.  
  492. ~48 #EM Required To End Macro~
  493.  
  494.    This is reported if you have a MACRO without an end.  In A86,
  495.    the end of a macro is given by #EM.  Most likely your file was
  496.    written for another assembler, and you need to convert macro
  497.    definitions.  You need to change all ENDM directives to #EM.
  498.    You also need to eliminate the named parameters from the MACRO
  499.    line, and replace occurrences of the named parameters with #1,
  500.    #2, #3, etc.  The & concatenation operator can be dropped. See
  501.    Chapter 11 for a full description of A86's macro syntax.
  502.  
  503. ~49 End Delimiter to COMMENT Required~
  504.                                                             14-10
  505.  
  506.    This is reported when the portion of code skipped in a COMMENT
  507.    directive has run to the end of the file, without the closing
  508.    delimiter being found.  You need to search backwards from the
  509.    end of the file to find the COMMENT directive, figure out
  510.    where you intend the directive to end, and duplicate the
  511.    delimiter (the first non-blank following COMMENT) at that end-
  512.    point.  See Chapter 4 for a full description of the COMMENT
  513.    directive.
  514.  
  515. ~50 Reg,Mem Required~
  516.  
  517.    This is reported when you have an improper combination of
  518.    operands for a MOV, XCHG, or general arithmetic instruction
  519.    such as ADD, SUB, CMP, XOR, etc.  Most often you have
  520.    attempted to provide two memory operands: MOV VAR1,VAR2 or ADD
  521.    VAR1,VAR2.  One of the operands must be a register.  You can
  522.    effect the memory-to-memory operation by using a register in a
  523.    two-instruction sequence; for example, MOV AX,VAR2 followed by
  524.    ADD VAR1,AX .  For convenience, A86 lets you code the sequence
  525.    with the single line ADD VAR1,AX,VAR2.
  526.  
  527.    If you don't wish to clobber the contents of any registers,
  528.    and the operands are word-sized, you may PUSH the source
  529.    operand and then POP to the destination operand: PUSH VAR2
  530.    followed by POP VAR1.
  531.  
  532. ~51 Segment Override Not Allowed Here~
  533.  
  534.    For compatibility with other assemblers, A86 allows segment
  535.    override operators CS:, DS:, ES:, or SS: within expressions in
  536.    instruction operands.  The override informs the assembler that
  537.    the named segment register is to be used for the memory
  538.    reference, so that the assembler might generate a segment
  539.    override opcode byte.  This error is reported when a segment
  540.    override operator occurs out of context: in A86's special
  541.    three-operand form for MOV or arithmetic instructions; within
  542.    a DATA segment or STRUC, or in an EQU directive.  You might
  543.    encounter the last case if you're porting a program written
  544.    for another assembler.  If so, you might have to provide
  545.    explicit overrides wherever the EQUated symbol is used.  It's
  546.    possible, though, that the override is provided only to
  547.    satisfy the other assembler's segment checking mechanism, and
  548.    no overrides are generated at all.  In that case, you can just
  549.    eliminate the override operator.
  550.  
  551. ~52 Byte Operand Required~
  552.  
  553.    This is reported when an operand to one of the NEC-specific
  554.    instructions STOBITS, LODBITS, ROL4, ROR4 is of the wrong
  555.    type.  STOBITS and LODBITS require the first operand to be a
  556.    byte-sized register and the second operand to be either a
  557.    byte=sized register or an immediate constant.  ROL4 and ROR4
  558.    require the only operand to be a byte-sized register.
  559.  
  560. ~53 Word Register Required~
  561.                                                             14-11
  562.  
  563.    This is reported when the first operand to any of the
  564.    instructions LDS, LES, LEA, BOUND, IMUL, LAR, or LSL is not a
  565.    word-sized general register (AX,BX,CX,DX,SI,DI,BP, or SP).
  566.  
  567. ~54 Floating-Point Chip Required~
  568.  
  569.    This is reported when you attempt to assemble a program with
  570.    floating point constants or floating point expressions, and
  571.    you do not have a floating point chip (8087 or 287) in your
  572.    computer system.  A86 uses the 87 to assemble constants and do
  573.    arithmetic.  It's time for you to buy a chip and install it in
  574.    that empty socket!
  575.  
  576. ~55 Bad Floating-Point Operand~
  577.  
  578.    This is reported when an operand to a floating point
  579.    instruction is not of the correct type.  See Chapter 7 for the
  580.    correct forms for the instruction you're coding.  Some
  581.    possibilites for the error are:
  582.  
  583.    * a memory operand has unspecified size, or a size not
  584.      compatible with the instruction.  Integer instructions
  585.      (FIxxx) require a W or D operand; floating arithmetic
  586.      instructions require a D or Q operand.
  587.  
  588.    * you've tried to specify an 86 register instead of a memory
  589.      operand.
  590.  
  591.    * you've tried A86's special FLD (constant) form in OBJ mode.
  592.      Sorry, I support this only for COM mode (mainly for D86).
  593.  
  594.    * you've specified two register numbers (0 through 7), but
  595.      neither is 0.
  596.  
  597.    * you've tried one of the disallowed forms FCOM i,0 or FCOMP
  598.      i,0
  599.  
  600. ~56 Constant 0--7 Required~
  601.  
  602.    This is reported if a constant number operand to an 87
  603.    instruction, which is supposed to represent an 87 stack number
  604.    (0 through 7), does not have the right value; i.e., it's not
  605.    an integer, or it's not in the range 0 through 7.
  606.  
  607. ~57 Memory Operand Required~
  608.  
  609.    This is reported when an operand to a floating-point or a 286
  610.    protected-mode instruction must be a memory operand, and the
  611.    operand you've provided isn't one.  See Chapters 7 (for
  612.    floating) or 6 (for protected) for the correct syntax of the
  613.    instruction you're coding.
  614.  
  615. ~58 Segment Or Struc Name Not Allowed~
  616.                                                             14-12
  617.  
  618.    This error occurs most often when you are attempting to
  619.    assemble as a COM program a file intended to be an EXE
  620.    program.  The COM format does not allow you to refer to the
  621.    value of a named segment.  We should either use the +O option
  622.    to produce an OBJ file, or simply eliminate the statements
  623.    intended to set the segment registers-- COM programs are
  624.    started with all segment registers already pointing to the
  625.    same value.
  626.  
  627.    This error is also reported when you provide the name of a
  628.    structure, or the name of an INT equate, in a place where a
  629.    register or memory operand is expected.
  630.  
  631. ~59 Word Operand Required~
  632.  
  633.    This is reported when something other than a word-sized
  634.    operand is provided for one of the 286 instructions ARPL,
  635.    SLDT, LLDT, STR, LTR, VERR, VERW, SMSW, or LMSW.
  636.  
  637. ~97 Object Overflow~
  638.  
  639.    This is reported when the assembler runs out of room in its
  640.    output object-code segment (which also holds records used to
  641.    resolve forward references).  This will happen only if your
  642.    object output nears the object capacity, which is 64K if a
  643.    full amount of memory (about 200K) is available to the
  644.    assembler.  If you have a limited amount of memory, you should
  645.    increase the memory available to A86, by buying another board,
  646.    or by having fewer memory-resident programs installed when you
  647.    run A86.  If you are assembling OBJ files, you can break the
  648.    program into smaller assembled modules.
  649.  
  650.    It's conceivable that this error could result in a D86
  651.    session, when you are using patch-memory mode to type in an
  652.    extremely complicated program.  In that case, you should type
  653.    the program into a text file instead, and use A86 to assemble
  654.    the text file.
  655.  
  656. ~98 Undefined Symbol Not Allowed~
  657.  
  658.    This error should occur only during a D86 debugging session,
  659.    when you type an immediate-execution assembly language line
  660.    containing a symbol on in the table (typically a mistyping on
  661.    your part).  D86 allows you to add symbols to the table only
  662.    when you are in patch-memory mode (reached by pressing the F7
  663.    key).
  664.  
  665. ~99 Symbol Table Overflow~
  666.  
  667.    This is reported when the symbol table runs out of space. It's
  668.    unlikely that you'll ever run into this error, since A86's
  669.    capacity is thousands of symbols.  If you do, you'll need to
  670.    reduce the number of symbols in your program.  One way to do
  671.    so is to replace all place-marker symbols with local labels in
  672.    a limited range (like L0--L9).  See Chapter 5 for a
  673.    description of A86's local label facility.
  674.  
  675.