Annotation of coherent/a/usr/man/COHERENT/as.8086, revision 1.1.1.1

1.1       root        1: 
                      2: 
                      3: as                           Command                           as
                      4: 
                      5: 
                      6: 
                      7: 
                      8: i8086 assembler
                      9: 
                     10: aass [-ggllxx] [ -oo_f_i_l_e ] _f_i_l_e ...
                     11: 
                     12: as is  the Mark Williams assembler.  It  is a multipass assembler
                     13: that  turns files  of assembly  language into  relocatable object
                     14: modules  similar  to  those  produced  by  the compiler.   as  is
                     15: designed   for  writing   small  assembly-language   subroutines.
                     16: Because it  is not intended  to be used  for full-scale assembly-
                     17: language  programming,  it  lacks  many  of  the  more  elaborate
                     18: facilities of full-fledged assemblers.  For example, there are no
                     19: facilities  for conditional  compilation or  user-defined macros.
                     20: However,  it does optimize  span-dependent instructions  (for ex-
                     21: ample, branches).
                     22: 
                     23: ***** Features *****
                     24: 
                     25: as includes the following features:
                     26: 
                     27: *   It  automatically  compiles  jump  instructions  into  either
                     28:    regular   (three-byte)  jumps   or  short   (two-byte)  jumps,
                     29:    whichever is  required.  There is  no explicit short  jump in-
                     30:    struction.
                     31: 
                     32: *  The assembler  supports temporary labels, which conserves sym-
                     33:    bol table space and relieves  the you of having to invent many
                     34:    unique labels.
                     35: 
                     36: *  Program modules are relocatable.  They can be linked with each
                     37:    other and with C program modules produced by the COHERENT com-
                     38:    piler.  All  assembled modules must be  linked before they can
                     39:    be executed.
                     40: 
                     41: *  The  assembler does not  support file inclusion,  but multiple
                     42:    source files  can be  concatenated and assembled  by including
                     43:    their names in the command line to run the assembler.
                     44: 
                     45: *  The  assembler generates SMALL  model objects in  the COHERENT
                     46:    l.out object format.
                     47: 
                     48: ***** Usage *****
                     49: 
                     50: Normally, the assembler is invoked via the cccc command, which will
                     51: automatically assemble and link  any file of source code that has
                     52: the  suffix .ss.   If you  wish, however, you  can invoke  the as-
                     53: sembler  as a  separate program, by  using the  following command
                     54: line:
                     55: 
                     56: 
                     57:              aass [-ggllxx] [ -oo _f_i_l_e ] _f_i_l_e ...
                     58: 
                     59: 
                     60: The named _f_i_l_es are concatenated and the resulting object code is
                     61: written to the file specified by  the -o option, or to file l.out
                     62: 
                     63: 
                     64: COHERENT Lexicon                                           Page 1
                     65: 
                     66: 
                     67: 
                     68: 
                     69: as                           Command                           as
                     70: 
                     71: 
                     72: 
                     73: if no -o option is given.
                     74: 
                     75: The option -g causes all symbols that are undefined at the end of
                     76: the first pass to be given the type undefined external, as though
                     77: they had been declared with a .globl directive.
                     78: 
                     79: The  option -l  tells the  assembler to  generate a  listing.  It
                     80: writes the listing to the standard output, normally the terminal;
                     81: it may  be easily  redirected to  a file or  printer using  the >
                     82: operator.
                     83: 
                     84: The option  -x strips from the symbol table  of the object module
                     85: all non-global  symbols that begin with  the character `L'.  This
                     86: speeds  up the  loading of  files by  removing compiler-generated
                     87: labels from the symbol table.
                     88: 
                     89: ***** Register Names *****
                     90: 
                     91: The  following lists  the  identifiers that  represent the  i8086
                     92: machine registers, which are predefined:
                     93: 
                     94: 
                     95:         AX      SP      AL      AH      CS
                     96:         BX      BP      BL      BH      DS
                     97:         CX      SI      CL      CH      ES
                     98:         DX      DI      DL      DH      SS
                     99: 
                    100: 
                    101: ***** Lexical Conventions *****
                    102: 
                    103: Assembler  tokens consist  of identifiers  (also known  as ``sym-
                    104: bols'' or ``names''), constants, and operators.
                    105: 
                    106: An identifier is a sequence of alphanumeric characters (including
                    107: the period `.' and the underscore `_').  The first character must
                    108: not be  numeric.  Only  the first 16  characters of the  name are
                    109: significant; it throws  away the remainder.  Upper case and lower
                    110: case  are different.  The  machine instructions,  assembly direc-
                    111: tives, and built-in symbols that are used frequently are in lower
                    112: case.
                    113: 
                    114: Numeric constants are defined  by the assembler by using the same
                    115: syntax as the C compiler: a sequence of digits that begins with a
                    116: zero  `0' is  an  octal constant;  a  sequence of  digits with  a
                    117: leading `0x' is a  hexadecimal constant (`A' through `F' have the
                    118: decimal values 10 through 15);  and any strings of digits that do
                    119: not begin with `0' are interpreted as decimal constants.
                    120: 
                    121: A  character constant  consists of an  apostrophe followed  by an
                    122: ASCII character.  The constant's  value is the ASCII code for the
                    123: character, right-justified in  the machine word.  For example, an
                    124: instruction to  move the letter `A' to the  register  al could be
                    125: expressed in either of two equivalent ways:
                    126: 
                    127: 
                    128: 
                    129: 
                    130: COHERENT Lexicon                                           Page 2
                    131: 
                    132: 
                    133: 
                    134: 
                    135: as                           Command                           as
                    136: 
                    137: 
                    138: 
                    139: 
                    140:         mov     al,$0x41
                    141:         mov     al,$'A
                    142: 
                    143: 
                    144: The dollar sign indicates an immediate operand.
                    145: 
                    146: A blank space can be  represented either 00xx2200 (its ASCII value in
                    147: hexadecimal), or as an apostrophe followed by a space (' ), which
                    148: on paper looks like just an apostrophe alone.
                    149: 
                    150: The following gives the multi-character escape sequences that can
                    151: be used in a character constant to represent special characters:
                    152: 
                    153: 
                    154:           \bb   Backspace    (0010)
                    155:           \ff   Formfeed     (0014)
                    156:           \nn   Newline      (0012)
                    157:           \rr   Carriage return(0015)
                    158:           \tt   Tab          (0011)
                    159:           \vv   Vertical tab (0013)
                    160:           \_n_n_n Octal value  (0_n_n_n)
                    161: 
                    162: 
                    163: A blank space can be  represented either as 0x20 (its ASCII value
                    164: in  hexadecimal), or as  an apostrophe  followed by a space (' ),
                    165: which on the page would look like just an apostrophe.
                    166: 
                    167: ***** Blanks and Tabs *****
                    168: 
                    169: Blanks and tab characters  may be used freely between tokens, but
                    170: not within  identifiers.  A blank  or a tabulation  character  is
                    171: required  to separate  adjacent tokens  not  otherwise separated,
                    172: e.g., between an instruction opcode and its first operand.
                    173: 
                    174: ***** Comments *****
                    175: 
                    176: Comments are  introduced by a slash (`/')  and continue until the
                    177: end of  the line.  All characters in comments  are ignored by the
                    178: assembler.
                    179: 
                    180: ***** Program Sections *****
                    181: 
                    182: The assembler permits  you to divide programs into sections, each
                    183: corresponding  (roughly)  to a  functional  area  of the  address
                    184: space.  Each program  section has its own location counter during
                    185: assembly.   There  are eight  program  sections, subdivided  into
                    186: three groups containing code, data and tables:
                    187: 
                    188: 
                    189:          code:   sshhrrii    Shared instruction
                    190:                  bbssssii    Uninitialized instruction
                    191:                  pprrvvii    Private instruction
                    192:          data:   pprrvvdd    Private data
                    193:                  sshhrrdd    Shared data
                    194: 
                    195: 
                    196: COHERENT Lexicon                                           Page 3
                    197: 
                    198: 
                    199: 
                    200: 
                    201: as                           Command                           as
                    202: 
                    203: 
                    204: 
                    205:                  bbssssdd    Uninitialized data
                    206:                  ssttrrnn    Strings
                    207:          tables: ssyymmtt    Symbol table
                    208: 
                    209: 
                    210: All Mark Williams assemblers  use the same set of sections.  This
                    211: increases the portability  of programs between operating systems.
                    212: Not all  the sections are  distinct under COHERENT,  however; the
                    213: meanings of  the sections under (including hints as  to how the C
                    214: compiler uses them) are as follows:
                    215: 
                    216: shri (shared  instruction) is the same  as prvi (private instruc-
                    217: tion);  the adjective  shared refers to  the sharing  of physical
                    218: memory between  two or more  concurrent processes.  prvi  is used
                    219: for all code generated by the C compiler.
                    220: 
                    221: Similarly, there  is no distinction  between shrd and  prvd.  The
                    222: compiler uses  the latter for  all external and  static data that
                    223: are explicitly initialized in a C program.
                    224: 
                    225: Uninitialized  sections are actually  initialized to  zeros.  The
                    226: reason is that the  C compiler uses the bssd (uninitialized data)
                    227: section for  external or static data that  are not explicitly in-
                    228: itialized: the C language  guarantees that these data are in fact
                    229: initialized to zeros.   The bssi (uninitialized instruction) sec-
                    230: tion is not used by the compiler.
                    231: 
                    232: The strn (strings) section is actually a special part of the data
                    233: section, used by the C compiler to store string constants.  It is
                    234: synonymous with prvd under COHERENT.
                    235: 
                    236: The symt (symbol table) section contains the symbol table used by
                    237: the linker.  Both the  C compiler and the assembler generate sym-
                    238: bol tables that go in this section.
                    239: 
                    240: In most  cases, you need  not worry about what  all these program
                    241: sections are,  and can simply write code  under the keyword .prvi
                    242: or .shri,  and write data under the keyword  .prvd or .shrd.  You
                    243: are advised not to place items  in the symt section, as this sec-
                    244: tion is used for internal communication among the C compiler, the
                    245: assembler, and the linker.
                    246: 
                    247: At  the end  of  assembly, the  sections  of a  program are  con-
                    248: catenated so that in  the assembly listing the program looks like
                    249: a monolithic block of code  and data.  All ccooddee sections are com-
                    250: bined into the i8086 ccooddee segment, and all ddaattaa sections into the
                    251: i8086  ddaattaa segment.   The symbol  table is  not linked  when the
                    252: program is executed, and so is not assigned to any i8086 segment.
                    253: 
                    254: ***** The Current Location *****
                    255: 
                    256: The special symbol `.'  (period) is a counter that represents the
                    257: current location.  The current  location can be changed by an as-
                    258: signment; for example:
                    259: 
                    260: 
                    261: 
                    262: COHERENT Lexicon                                           Page 4
                    263: 
                    264: 
                    265: 
                    266: 
                    267: as                           Command                           as
                    268: 
                    269: 
                    270: 
                    271: 
                    272:          . = .+START
                    273: 
                    274: 
                    275: The assignment must not cause  the value to decrease, and it must
                    276: not change the program section, i.e., the right-hand operand must
                    277: be defined in the same section as the current section.
                    278: 
                    279: ***** Expressions *****
                    280: 
                    281: An expression is a sequence of symbols representing a value and a
                    282: program section.   Expressions are  made up of  identifiers, con-
                    283: stants, operators, and brackets.  All binary operators have equal
                    284: precedence and are  executed in a strict left-to-right order (un-
                    285: less altered by brackets).
                    286: 
                    287: Notice  that  square brackets,  `['  and  `]',  group  expression
                    288: elements, because  parentheses are used for  indexed register ad-
                    289: dressing.
                    290: 
                    291: ***** Types *****
                    292: 
                    293: Every  expression has  a type  determined  by its  operands.  The
                    294: simplest  operands are  symbols.   The types  of  symbols are  as
                    295: follows:
                    296: 
                    297: Undefined A symbol is defined if  it is a constant or a label, or
                    298:           when  assigned a  defined value;  otherwise, it  is un-
                    299:           defined.  A  symbol may become  undefined if it  is as-
                    300:           signed the value  of an undefined expression.  It is an
                    301:           error to  assemble an  undefined expression in  pass 2.
                    302:           Pass  1 allows assembly  of undefined  expressions, but
                    303:           phase errors  may  be produced if undefined expressions
                    304:           are used  in certain  contexts, such  as in a  .blkw or
                    305:           .blkb.
                    306: 
                    307: Absolute   An absolute  symbol is one  defined ultimately  from a
                    308:           constant  or  from the  difference  of two  relocatable
                    309:           values.
                    310: 
                    311: Register  These are the machine registers.
                    312: 
                    313: Relocatable
                    314:           All other user  symbols are relocatable symbols in some
                    315:           program section.   Each program section  is a different
                    316:           relocatable type.
                    317: 
                    318: Each keyword  in the assembler has a  secret type that identifies
                    319: it internally;  however, all of these  secret types are converted
                    320: to absolute in expressions.  Thus,  any keyword may be used in an
                    321: expression to  obtain the  basic value  of the keyword.   This is
                    322: useful when  employing the keywords that  define machine instruc-
                    323: tions.  The basic value of a machine operation is usually the op-
                    324: code with any operand-specific bits set to zero.
                    325: 
                    326: 
                    327: 
                    328: COHERENT Lexicon                                           Page 5
                    329: 
                    330: 
                    331: 
                    332: 
                    333: as                           Command                           as
                    334: 
                    335: 
                    336: 
                    337: Notice that  the type of an expression does  not include such at-
                    338: tributes  as length  (word or  byte), so  the assembler  will not
                    339: remember whether  you defined a particular variable  to be a word
                    340: or a byte.  Addresses and constants have different types, but the
                    341: assembler does not treat  a constant as an immediate value unless
                    342: it is preceded by a dollar sign `$'.  If you use a constant where
                    343: an address  is expected, aass  will treat the constant  like an ad-
                    344: dress (and  vice versa).  It is up to  you to distinguish between
                    345: variables and addresses or immediate values.
                    346: 
                    347: ***** Operators *****
                    348: 
                    349: The  following  figure shows  various  characters interpreted  as
                    350: operators in expressions.
                    351: 
                    352: 
                    353:           +   Addition
                    354:           -   Subtraction
                    355:           *   Multiplication
                    356:           -   Unary negation
                    357:           ~   Unary complement
                    358:           ^   Type transfer
                    359:           |   Segment construction
                    360: 
                    361: 
                    362: You can  group expressions by means of  square brackets (`['  and
                    363: `]'); parentheses  are reserved for use  in address mode descrip-
                    364: tions.
                    365: 
                    366: ***** Type Propagation *****
                    367: 
                    368: When operands are  combined in expressions, the resulting type is
                    369: a function  of both the  operator and the types  of the operands.
                    370: The operators  `*', `~', and  unary `-'  can  only manipulate ab-
                    371: solute operands and always yield an absolute result.
                    372: 
                    373: The operator `+'  signifies the addition of two absolute operands
                    374: to yield an absolute result, and the addition of an absolute to a
                    375: relocatable operand  to yield a result with the  same type as the
                    376: relocatable operand.
                    377: 
                    378: The binary operator `-' allows two operands of the same type, in-
                    379: cluding  relocatable,  to  be  subtracted  to yield  an  absolute
                    380: result.   It also  allows  an absolute  to be  subtracted from  a
                    381: relocatable, to yield a result with the same type as the relocat-
                    382: able operand.
                    383: 
                    384: The binary  operator `^'  yields a result  with the value  of its
                    385: left operand and  the type of its right operand.   It may be used
                    386: to create expressions (usually  intended to be used in an assign-
                    387: ment statement) with any desired type.
                    388: 
                    389: ***** Statements *****
                    390: 
                    391: A  program consists  of  a sequence  of  statements separated  by
                    392: 
                    393: 
                    394: COHERENT Lexicon                                           Page 6
                    395: 
                    396: 
                    397: 
                    398: 
                    399: as                           Command                           as
                    400: 
                    401: 
                    402: 
                    403: newlines or  by semicolons.  There are  four kinds of statements:
                    404: null statements,  assignment statements, keyword  statements, and
                    405: machine instructions.
                    406: 
                    407: ***** Labels *****
                    408: 
                    409: You can precede any statement by any number of labels.  There are
                    410: two kinds of labels: _n_a_m_e _l_a_b_e_l_s and _t_e_m_p_o_r_a_r_y _l_a_b_e_l_s.
                    411: 
                    412: A name  label consists of an identifier followed  by a colon (:).
                    413: The program section and value of the label are set to that of the
                    414: current  location counter.   It is  an error for  the value  of a
                    415: label to change during an assembly.  This most often happens when
                    416: an undefined symbol is used to control a location counter adjust-
                    417: ment.
                    418: 
                    419: A temporary  label consists of  a digit (00  to 99)  followed  by a
                    420: colon (:).   Such a label defines temporary  symbols of the  form
                    421: xxff and xxbb, where xx is  the digit of the label.  References of the
                    422: form xxff  refer to the  first temporary label xx:  forward from the
                    423: reference;  those of  the form  xxbb refer  to the  first temporary
                    424: label xx: backward  from the reference.  Such labels conserve sym-
                    425: bol table space in the assembler.
                    426: 
                    427: ***** Null Statements *****
                    428: 
                    429: A  null statement  is an  empty line, or  a line  containing only
                    430: labels or  a comment.  Null statements  can occur anywhere.  They
                    431: are ignored  by the assembler,  except that any  labels are given
                    432: the current value of the location counter.
                    433: 
                    434: ***** Assignment Statements *****
                    435: 
                    436: An assignment statement  consists of an identifier followed by an
                    437: equal sign `=' and  an expression.  The value and program section
                    438: of the identifier are set  to that of the expression.  Any symbol
                    439: defined by  an assignment statement  may be redefined,  either by
                    440: another  assignment  statement  or  by  a label.   An  assignment
                    441: statement  is equivalent  to the equ  keyword statement  found in
                    442: many assemblers.
                    443: 
                    444: ***** Assembler Directives *****
                    445: 
                    446: Assembler  directives give instructions  to the  assembler.  Each
                    447: directive keyword  begins with a period, and  in general they are
                    448: followed by operands.
                    449: 
                    450: The following  directives change  the current program  section to
                    451: the named section:
                    452: 
                    453: 
                    454: 
                    455: 
                    456: 
                    457: 
                    458: 
                    459: 
                    460: COHERENT Lexicon                                           Page 7
                    461: 
                    462: 
                    463: 
                    464: 
                    465: as                           Command                           as
                    466: 
                    467: 
                    468: 
                    469:              .bssd
                    470:              .bssi
                    471:              .prvd
                    472:              .prvi
                    473:              .shrd
                    474:              .shri
                    475:              .strn
                    476:              .symt
                    477: 
                    478: 
                    479: The current location counter is set to the highest previous value
                    480: of the location counter for the selected section.
                    481: 
                    482: The following describes the directives in detail.
                    483: 
                    484: .aasscciiii _s_t_r_i_n_g
                    485:      The first  non-white space character,  typically a quotation
                    486:      mark, after  the keyword  is taken  as a delimiter.   as as-
                    487:      sembles successive  characters from the  string into succes-
                    488:      sive  bytes until  it encounters the  next instance  of this
                    489:      delimiter.   To include  a quotation mark  in a  string, use
                    490:      some other character for the delimiter.
                    491: 
                    492:      It  is  an error  for  a newline  to  be encountered  before
                    493:      reaching the final delimiter.  You can use a multi-character
                    494:      constant  in  the string  to  represent  newlines and  other
                    495:      special characters.
                    496: 
                    497: .bbllkkbb _e_x_p_r_e_s_s_i_o_n
                    498:      Assemble a block of  bytes that are filled with zeroes.  The
                    499:      block is expression bytes long.
                    500: 
                    501: .bbllkkww _e_x_p_r_e_s_s_i_o_n
                    502:      Assemble a block of  words that are filled with zeroes.  The
                    503:      block is expression words long.
                    504: 
                    505: .bbyyttee _e_x_p_r_e_s_s_i_o_n [, _e_x_p_r_e_s_s_i_o_n ]
                    506:      The _e_x_p_r_e_s_s_i_o_ns  in the list are truncated  to byte size and
                    507:      assembled  into successive bytes.   Expressions in  the list
                    508:      are separated by commas.
                    509: 
                    510: .eevveenn
                    511:      Force alignment by inserting  a null byte of data, if neces-
                    512:      sary, to set the location counter to the next even location.
                    513: 
                    514: .oodddd
                    515:      Force alignment by inserting  a null byte of data, if neces-
                    516:      sary, to set the location counter to the next odd location.
                    517: 
                    518: .gglloobbll _i_d_e_n_t_i_f_i_e_r [, _i_d_e_n_t_i_f_i_e_r ]
                    519:      The identifiers  in the  comma-separated list are  marked as
                    520:      global.  If  they are defined in  the current assembly, they
                    521:      may be  referenced by other object modules;  if they are un-
                    522:      defined, they  must be resolved by  the linker before execu-
                    523:      tion.
                    524: 
                    525: 
                    526: COHERENT Lexicon                                           Page 8
                    527: 
                    528: 
                    529: 
                    530: 
                    531: as                           Command                           as
                    532: 
                    533: 
                    534: 
                    535: 
                    536: .ppaaggee
                    537:      Force the printed  listing of your assembly-language program
                    538:      to skip  to the top of  a new page by  inserting a form-feed
                    539:      character into the file.  The title is printed at the top of
                    540:      the page.
                    541: 
                    542: .ttiittllee _s_t_r_i_n_g
                    543:      Print string at the top  of every page in the listing.  This
                    544:      directive also causes the listing to skip to a new page.
                    545: 
                    546: .wwoorrdd _e_x_p_r_e_s_s_i_o_n [, _e_x_p_r_e_s_s_i_o_n ]
                    547:      Truncate _e_x_p_r_e_s_s_i_o_ns to  word length and assemble the resul-
                    548:      ting data  into successive  words.  Expressions in  the list
                    549:      are separated by commas.
                    550: 
                    551: ***** Address Descriptors *****
                    552: 
                    553: The following  syntax is used for  general source and destination
                    554: address descriptors.  The symbol `r' refers to a register and the
                    555: symbol  `e'  to  an expression.   Please  refer to  the following
                    556: figure.
                    557: 
                    558: 
                    559:        _S_y_n_t_a_x                            _A_d_d_r_e_s_s_i_n_g _M_o_d_e    _E_x_a_m_p_l_e
                    560: 
                    561:        r     Register                mov  ax, cx
                    562:        e     Direct address          mov  ax, 0800
                    563:        (r)   Indexing, no displacement    movax, (bx)
                    564:        e(r)  Indexing with displacement   movax, 2(bx)
                    565:        (r,r) Double indexing, no displacementmov ax, (bx, si)
                    566:        e(r,r)                        Double indexing with displacementmov ax, 2(bx, si)
                    567:        $e    Immediate               mov  ax, $0800
                    568: 
                    569: 
                    570: Note that the dollar sign is always used to indicate an immediate
                    571: value, even if the expression is a constant.
                    572: 
                    573: A direct  address is interpreted as either a  direct address or a
                    574: PC-relative  displacement, depending on  the requirements  of the
                    575: instruction.
                    576: 
                    577: If an address descriptor  indicates an indexing mode and the base
                    578: expression is  of type absolute, the  assembler uses the shortest
                    579: displacement length  (zero, one, or two bytes)  that can hold the
                    580: expression's value.   Relocatable base expressions,  whose values
                    581: cannot be completely  determined until the program is loaded, are
                    582: always assigned two-byte displacements.
                    583: 
                    584: Any  address  descriptor  may be  modified  by  a segment  escape
                    585: prefix.  A  segment escape prefix consists  of a segment register
                    586: name followed by a colon `:'.  The escape causes the assembler to
                    587: produce a segment override prefix that uses the specified segment
                    588: register as  an operand.  The assembler  does not produce segment
                    589: override prefixes unless explicitly required by an instruction.
                    590: 
                    591: 
                    592: COHERENT Lexicon                                           Page 9
                    593: 
                    594: 
                    595: 
                    596: 
                    597: as                           Command                           as
                    598: 
                    599: 
                    600: 
                    601: 
                    602: ***** 8086 Instructions *****
                    603: 
                    604: The  following machine  instructions are  defined.   The examples
                    605: illustrate the general syntax of the operands.  Combinations that
                    606: are syntactically valid may be forbidden for semantic reasons.
                    607: 
                    608: The examples use the following references:
                    609: 
                    610: 
                    611:        _a     General address
                    612:        _a_l    AL register
                    613:        _a_x    AX register
                    614:        _c_l    CL register
                    615:        _d     Direct address
                    616:        _d_x    DX register
                    617:        _e     Expression
                    618:        $_e    Immediate expression
                    619:        _m     Memory address (not an immediate)
                    620:        _p     Port address
                    621: 
                    622: 
                    623: aass treats as ordinary one-byte machine operations some operations
                    624: that the Intel assembler ASM86 handles with special syntax; these
                    625: include the  _l_o_c_k and  _r_e_p_e_a_t prefixes.   aass makes no  attempt to
                    626: prevent  the generation  of incorrect  sequences of  these prefix
                    627: bytes.
                    628: 
                    629: Although every machine  operation has a type and value associated
                    630: with it, in most cases the value was chosen to help aass format the
                    631: machine instructions.
                    632: 
                    633: For more  information on these instructions,  see the Intel ASM86
                    634: Assembly Language Reference Manual.
                    635: 
                    636:     aaaaaa             ASCII adjust AL after addition
                    637:     aaaadd             ASCII adjust AX before division
                    638:     aaaamm             ASCII adjust AX after multiply
                    639:     aaaass             ASCII adjust AL after subtraction
                    640:     aaddccbb    _r, _a    Add with carry, byte
                    641:     aaddcc     _r, _a    Add with carry, word
                    642:     aaddccbb    _a, _r    Add with carry, byte
                    643:     aaddcc     _a, _r    Add with carry, word
                    644:     aaddccbb    _a, $_e   Add with carry, byte
                    645:     aaddcc     _a, $_e   Add with carry, word
                    646:     aaddddbb    _r, _a    Add, byte
                    647:     aadddd     _r, _a    Add, word
                    648:     aaddddbb    _a, _r    Add, byte
                    649:     aadddd     _a, _r    Add, word
                    650:     aaddddbb    _a, $_e   Add, byte
                    651:     aadddd     _a, $_e   Add, word
                    652:     aannddbb    _r, _a    Logical and, byte
                    653:     aanndd     _r, _a    Logical and, word
                    654:     aannddbb    _a, _r    Logical and, byte
                    655:     aanndd     _a, _r    Logical and, word
                    656: 
                    657: 
                    658: COHERENT Lexicon                                          Page 10
                    659: 
                    660: 
                    661: 
                    662: 
                    663: as                           Command                           as
                    664: 
                    665: 
                    666: 
                    667:     aannddbb    _a, $_e   Logical and, byte
                    668:     aanndd     _a, $_e   Logical and, word
                    669:     ccaallll    _d       Near call, PC-relative
                    670:     ccbbww             Convert byte into word
                    671:     ccllcc             Clear carry flag
                    672:     cclldd             Clear direction flag
                    673:     ccllii             Clear interrupt flag
                    674:     ccmmcc             Complement carry flag
                    675:     ccmmppbb    _r, _a    Compare two operands, byte
                    676:     ccmmpp     _r, _a    Compare two operands, word
                    677:     ccmmppbb    _a, _r    Compare two operands, byte
                    678:     ccmmpp     _a, _r    Compare two operands, word
                    679:     ccmmppbb    _a, $_e   Compare two operands, byte
                    680:     ccmmpp     _a, $_e   Compare two operands, word
                    681:     ccmmppss            Compare string operands, bytes
                    682:     ccmmppssbb           Compare string operands, bytes
                    683:     ccmmppssww           Compare string operands, words
                    684:     ccwwdd             Convert word to double
                    685:     ddaaaa             Decimal adjust AL after addition
                    686:     ddaass             Decimal adjust AL after subtraction
                    687:     ddeeccbb    _a       Decrement by one, byte
                    688:     ddeecc     _a       Decrement by one, word
                    689:     ddiivvbb    _m       Unsigned divide, byte
                    690:     ddiivv     _m       Unsigned divide, word
                    691:     eesscc     _a       Escape 00xxDD88
                    692:     hhlltt             Halt
                    693:     iiccaallll   _a       Near call, absolute offset at EA word
                    694:     iiddiivvbb   _m       Signed divide, byte
                    695:     iiddiivv    _m       Signed divide, word
                    696:     iijjmmpp    _a       Jump short, absolute offset at EA word
                    697:     iimmuullbb   _m       Signed multiply, byte
                    698:     iimmuull    _m       Signed multiply, word
                    699:     iinnbb     _a_l, _p   Input, byte
                    700:     iinn      _a_x, _p   Input, word
                    701:     iinnbb     _a_l, _d_x  Input, byte
                    702:     iinn      _a_x, _d_x  Input, word
                    703:     iinnccbb    _a       Increment by one, byte
                    704:     iinncc     _a       Increment by one, word
                    705:     iinntt     _e       Call to interrupt
                    706:     iinnttoo            Call to interrupt, overflow
                    707:     iirreett            Interrupt return
                    708:     jjaa      _d       Jump short if greater
                    709:     jjaaee     _d       Jump short if greater or equal
                    710:     jjbb      _d       Jump short if less
                    711:     jjbbee     _d       Jump short if less or equal
                    712:     jjcc      _d       Jump short if carry
                    713:     jjccxxzz    _d       Jump short if CX equals zero
                    714:     jjee      _d       Jump short if equal to
                    715:     jjgg      _d       Jump short if greater
                    716:     jjggee     _d       Jump short if greater or equal
                    717:     jjll      _d       Jump short if less
                    718:     jjllee     _d       Jump short if less or equal
                    719:     jjmmpp     _d       Jump short, PC-relative word offset
                    720:     jjmmppbb    _d       Jump short, PC-relative byte offset
                    721:     jjmmppll    _d       Jump long
                    722: 
                    723: 
                    724: COHERENT Lexicon                                          Page 11
                    725: 
                    726: 
                    727: 
                    728: 
                    729: as                           Command                           as
                    730: 
                    731: 
                    732: 
                    733:     jjnnaa     _d       Jump short if not above
                    734:     jjnnaaee    _d       Jump short if not above or equal
                    735:     jjnnbb     _d       Jump short if not below
                    736:     jjnnbbee    _d       Jump short if not below or equal
                    737:     jjnncc     _d       Jump short if not carry
                    738:     jjnnee     _d       Jump short if not equal
                    739:     jjnngg     _d       Jump short if not greater
                    740:     jjnnggee    _d       Jump short if not greater or equal
                    741:     jjnnll     _d       Jump short if not less
                    742:     jjnnllee    _d       Jump short if not less or equal
                    743:     jjnnoo     _d       Jump short if not overflow
                    744:     jjnnpp     _d       Jump short if not parity
                    745:     jjnnss     _d       Jump short if not sign
                    746:     jjnnzz     _d       Jump short if not zero
                    747:     jjoo      _d       Jump short if overflow
                    748:     jjpp      _d       Jump short if parity
                    749:     jjppee     _d       Jump short if parity even
                    750:     jjppoo     _d       Jump short if parity odd
                    751:     jjss      _d       Jump short if sign
                    752:     jjzz      _d       Jump short if zero
                    753:     llaahhff            Load flags into AH register
                    754:     llddss     _r, _a    Load double pointer into DS
                    755:     lleeaa     _r, _a    Load effective address offset
                    756:     lleess     _r, _a    Load double pointer into ES
                    757:     lloocckk            Assert BUS LOCK signal
                    758:     llooddssbb           Load byte into AL
                    759:     llooddss            Load byte into AL
                    760:     llooddssww           Load byte into AL
                    761:     lloooopp    _d       Loop; decrement CX, jump short
                    762:                     if CX less than zero
                    763:     llooooppee   _d       Loop; decrement CX, jump short
                    764:                     if CZ not zero and equal
                    765:     llooooppnnee  _d       Loop; decrement CX, jump short
                    766:                     if CX not zero and not equal
                    767:     llooooppnnzz  _d       Loop; decrement CX, jump short
                    768:                     if CZ not zero and ZF equals zero
                    769:     llooooppzz   _d       Loop; decrement CX, jump short
                    770:                     if CX not zero and zero
                    771:     mmoovvbb    _r, _a    Move, byte
                    772:     mmoovv     _r, _a    Move, word
                    773:     mmoovvbb    _a, _r    Move, byte
                    774:     mmoovv     _a, _r    Move, word
                    775:     mmoovvbb    _a, $_e   Move, byte
                    776:     mmoovv     _a, $_e   Move, word
                    777:     mmoovvbb    _a, _s    Move, byte
                    778:     mmoovv     _a, _s    Move, word
                    779:     mmoovvbb    _s, _a    Move, byte
                    780:     mmoovv     _s, _a    Move, word
                    781:     mmoovvssbb           Move string byte-by-byte
                    782:     mmoovvss            Move string word-by-word
                    783:     mmoovvssww           Move string word-by-word
                    784:     mmuullbb    _m       Multiply, byte
                    785:     mmuull     _m       Multiply, word
                    786:     nneeggbb    _a       Two's complement negation, byte
                    787:     nneegg     _a       Two's complement negation, word
                    788: 
                    789: 
                    790: COHERENT Lexicon                                          Page 12
                    791: 
                    792: 
                    793: 
                    794: 
                    795: as                           Command                           as
                    796: 
                    797: 
                    798: 
                    799:     nnoopp             No operation
                    800:     nnoottbb    _a       One's complement negation, byte
                    801:     nnoott     _a       One's complement negation, word
                    802:     oorrbb     _r, _a    Logical inclusive OR, byte
                    803:     oorr      _r, _a    Logical inclusive OR, word
                    804:     oorrbb     _a, _r    Logical inclusive OR, byte
                    805:     oorr      _a, _r    Logical inclusive OR, word
                    806:     oorrbb     _a, $_e   Logical inclusive OR, byte
                    807:     oorr      _a, $_e   Logical inclusive OR, word
                    808:     oouuttbb    _p, _a_l   Output to port, byte
                    809:     oouutt     _p, _a_x   Output to port, word
                    810:     oouuttbb    _d_x, _a_l  Output to port, byte
                    811:     oouutt     _d_x, _a_x  Output to port, word
                    812:     ppoopp     _m       Pop a word from the stack
                    813:     ppoopp     _s       Pop a word from the stack
                    814:     ppooppff            Pop from stack into flags register
                    815:     ppuusshh    _m       Push a word onto the stack
                    816:     ppuusshh    _s       Push a word onto the stack
                    817:     ppuusshhff           Push flags register onto the stack
                    818:     rrccllbb    _a, $_1   Rotate left $1 times, byte
                    819:     rrccllbb    _a, _c_l   Rotate left CL times, byte
                    820:     rrccll     _a, $_1   Rotate left $1 times, word
                    821:     rrccll     _a, _c_l   Rotate left CL times, word
                    822:     rrccrrbb    _a, $_1   Rotate right $1 times, byte
                    823:     rrccrrbb    _a, _c_l   Rotate right CL times, byte
                    824:     rrccrr     _a, $_1   Rotate right $1 times, word
                    825:     rrccrr     _a, _c_l   Rotate right CL times, word
                    826:     rreepp             Repeat following string operation
                    827:     rreeppee            Find nonmatching bytes
                    828:     rreeppnnee           Repeat, not equal
                    829:     rreeppnnzz           Repeat, not equal
                    830:     rreeppzz            Repeat, equal
                    831:     rreett             Return from procedure
                    832:     rroollbb    _a, $_1   Rotate left, byte
                    833:     rroollbb    _a, _c_l   Rotate left, byte
                    834:     rrooll     _a, $_1   Rotate left, word
                    835:     rrooll     _a, _c_l   Rotate left, word
                    836:     rroorrbb    _a, $_1   Rotate right, byte
                    837:     rroorrbb    _a, _c_l   Rotate right, byte
                    838:     rroorr     _a, $_1   Rotate right, word
                    839:     rroorr     _a, _c_l   Rotate right, word
                    840:     ssaahhff            Store AH into flags
                    841:     ssaallbb    _a, $_1   Shift left, byte
                    842:     ssaallbb    _a, _c_l   Shift left, byte
                    843:     ssaall     _a, $_1   Shift left, word
                    844:     ssaall     _a, _c_l   Shift left, word
                    845:     ssaarrbb    _a, $_1   Shift right, byte
                    846:     ssaarrbb    _a, _c_l   Shift right, byte
                    847:     ssaarr     _a, $_1   Shift right, word
                    848:     ssaarr     _a, _c_l   Shift right, word
                    849:     ssbbbbbb    _r, _a    Integer subtract with borrow, byte
                    850:     ssbbbb     _r, _a    Integer subtract with borrow, word
                    851:     ssbbbbbb    _a, _r    Integer subtract with borrow, byte
                    852:     ssbbbb     _a, _r    Integer subtract with borrow, word
                    853:     ssbbbbbb    _a, $_e   Integer subtract with borrow, byte
                    854: 
                    855: 
                    856: COHERENT Lexicon                                          Page 13
                    857: 
                    858: 
                    859: 
                    860: 
                    861: as                           Command                           as
                    862: 
                    863: 
                    864: 
                    865:     ssbbbb     _a, $_e   Integer subtract with borrow, word
                    866:     ssccaassbb           Compare string data, byte
                    867:     ssccaass            Compare string data, word
                    868:     sshhllbb    _a, $_1   Shift left, byte
                    869:     sshhllbb    _a, _c_l   Shift left, byte
                    870:     sshhll     _a, $_1   Shift left, word
                    871:     sshhll     _a, _c_l   Shift left, word
                    872:     sshhrrbb    _a, $_1   Shift right, byte
                    873:     sshhrrbb    _a, _c_l   Shift right, byte
                    874:     sshhrr     _a, $_1   Shift right, word
                    875:     sshhrr     _a, _c_l   Shift right, word
                    876:     ssttcc             Set carry flag
                    877:     ssttdd             Set direction flag
                    878:     ssttii             Set interrupt enable flag
                    879:     ssttoossbb           Store string data, byte
                    880:     ssttooss            Store string data, byte or word
                    881:     ssttoossww           Store string data, word
                    882:     ssuubbbb    _r, _a    Integer subtraction, byte
                    883:     ssuubb     _r, _a    Integer subtraction, word
                    884:     ssuubbbb    _a, _r    Integer subtraction, byte
                    885:     ssuubb     _a, _r    Integer subtraction, word
                    886:     ssuubbbb    _a, $_e   Integer subtraction, byte
                    887:     ssuubb     _a, $_e   Integer subtraction, word
                    888:     tteessttbb   _r, _a    Logical compare, byte
                    889:     tteesstt    _r, _a    Logical compare, word
                    890:     tteessttbb   _a, _r    Logical compare, byte
                    891:     tteesstt    _a, _r    Logical compare, word
                    892:     tteessttbb   _a, $_e   Logical compare, byte
                    893:     tteesstt    _a, $_e   Logical compare, word
                    894:     wwaaiitt            Wait until BUSY pin is inactive
                    895:     xxccaallll   _d, _d    Far call, immediate four-byte address
                    896:     xxcchhggbb   _r, _a    Exchange memory, byte
                    897:     xxcchhgg    _r, _a    Exchange memory, word
                    898:     xxiiccaallll          Far call, address at EA double word
                    899:     xxiijjmmpp           Jump far, address at memory double word
                    900:     xxjjmmpp    _d, _d    Jump far, immediate four-byte address
                    901:     xxllaatt            Table look-up translation
                    902:     xxoorrbb    _r, _a    Logical exclusive OR, byte
                    903:     xxoorr     _r, _a    Logical exclusive OR, word
                    904:     xxoorrbb    _a, _r    Logical exclusive OR, byte
                    905:     xxoorr     _a, _r    Logical exclusive OR, word
                    906:     xxoorrbb    _a, $_e   Logical exclusive OR, byte
                    907:     xxoorr     _a, $_e   Logical exclusive OR, word
                    908:     xxrreett            Return, intersegment
                    909: 
                    910: ***** 80286 Instructions *****
                    911: 
                    912: The  following  instructions  implement  80286-specific  actions.
                    913: Programs that use them cannot be run on 8086-based machines.
                    914: 
                    915:     ppuusshhaa           Push all general registers
                    916:     ppooppaa            Pop all general registers
                    917: 
                    918:     iinnssbb            Input byte from port DX to ES:(DI)
                    919:     iinnss             Input word from port DX to ES:(DI)
                    920: 
                    921: 
                    922: COHERENT Lexicon                                          Page 14
                    923: 
                    924: 
                    925: 
                    926: 
                    927: as                           Command                           as
                    928: 
                    929: 
                    930: 
                    931:     oouuttssbb           Output byte from port DX from ES:(DI)
                    932:     oouuttss            Output word from port DX from ES:(DI)
                    933: 
                    934:     eenntteerr   $_e, $_e  Make stack frame for procedure
                    935:     lleeaavvee           Tear down stack frame for procedure
                    936: 
                    937:     bboouunndd   _r, _e    Check array index against bounds
                    938: 
                    939:     ssllddtt    _a       Store Local Descriptor Table Register
                    940:     ssttrr     _a       Store Task Register
                    941:     llllddtt    _a       Load Local Descriptor Table Register
                    942:     llttrr     _a       Load Task Register
                    943:     vveerrrr    _a       Verify a segment for reading
                    944:     vveerrww    _a       Verify a segment for writing
                    945: 
                    946:     ssggddtt    _m       Store Global Descriptor Table register
                    947:     ssiiddtt    _m       Store Interrupt Descriptor Table register
                    948:     llggddtt    _m       Load Global Descriptor Table register
                    949:     lliiddtt    _m       Load Interrupt Descriptor Table register
                    950:     ssmmssww    _a       Store Machine Status Word
                    951:     llmmssww    _a       Load Machine Status Word
                    952: 
                    953:     llaarr     _r,_a     Load access rights byte
                    954:     llssll     _r,_a     Load segment limit
                    955: 
                    956:     ccllttss            Clear Task Switched Flag
                    957:     aarrppll            Adjust RPL field of Selector
                    958: 
                    959:     ppuusshh    $_e      Push sign extended byte
                    960: Also the $_1 forms become $_e  on  rol, rolb, ror, rorb, sal, salb,
                    961: shrb, shr,  and shrb.  This is because 8086  task of shifting and
                    962: rotating by an immediate value could only take an immediate value
                    963: of 1; however, on the 80286 the immediate value may be up to 31.
                    964: 
                    965: ***** i8087 Op Codes *****
                    966: 
                    967: The assembler  can also  generate object  files for use  with the
                    968: i8087 mathematics  co-processor.  The following  listing presents
                    969: the assembly  language op codes for  this feature.  sstt00 indicates
                    970: floating point  register 0 and  sstt11 indicates any  floating point
                    971: register but 0; dd is the same as in the above listing.
                    972: 
                    973: 
                    974:           _d  Direct address
                    975:           _s_t_0Floating point register 0
                    976:           _s_t_1Any floating point register _e_x_c_e_p_t 0
                    977: 
                    978: 
                    979: The following lists the i8087 instructions:
                    980:     ffaabbss            Absolute value
                    981:     ffaadddd    _s_t_0, _s_t_1Add real
                    982:     ffaadddd    _s_t_1, _s_t_0Add real
                    983:     ffffaadddd   _d       Add real, float
                    984:     ffddaadddd   _d       Add real, double
                    985:     ffaaddddpp           Add real and pop
                    986: 
                    987: 
                    988: COHERENT Lexicon                                          Page 15
                    989: 
                    990: 
                    991: 
                    992: 
                    993: as                           Command                           as
                    994: 
                    995: 
                    996: 
                    997:     ffaaddddpp   _s_t, _s_t_0 Add real and pop
                    998:     ffbblldd    _d       Load packed decimal (BCD)
                    999:     ffbbssttpp   _d       Store packed decimal (BCD) and pop
                   1000:     ffcchhss            Change sign
                   1001:     ffcclleexx           Clear exception
                   1002:     ffnncclleexx          Clear exception
                   1003:     ffccoomm            Compare real
                   1004:     ffffccoomm   _d       Compare real, float
                   1005:     ffddccoomm   _d       Compare real, double
                   1006:     ffccoommpp           Compare real and pop
                   1007:     ffccoommpp   st1     Compare real and pop
                   1008:     ffffccoommpp  _d       Compare real and pop, float
                   1009:     ffddccoommpp  _d       Compare real and pop, double
                   1010:     ffccoommpppp          Compare real and pop twice
                   1011:     ffddeeccssttpp         Decrement stack pointer
                   1012:     ffddiissii           Disable interrupts
                   1013:     ffnnddiissii          Disable interrupts, no operands
                   1014:     ffddiivv    _s_t_0, _s_t_1Divide real
                   1015:     ffddiivv    _s_t_1, _s_t_0Divide real
                   1016:     ffffddiivv   _d       Divide real, float
                   1017:     ffddddiivv   _d       Divide real, double
                   1018:     ffddiivvpp           Divide real and pop
                   1019:     ffddiivvpp   st1     Divide real and pop
                   1020:     ffddiivvrr   _s_t_0, _s_t_1Divide real reversed
                   1021:     ffddiivvrr   _s_t_1, _s_t_0Divide real reversed
                   1022:     ffffddiivvrr  _d       Divide real reversed, float
                   1023:     ffddddiivvrr  _d       Divide real reversed, double
                   1024:     ffddiivvrrpp          Divide real reversed and pop
                   1025:     ffddiivvrrpp  _s_t_1     Divide real reversed and pop
                   1026:     ffeennii            Enable interrupts
                   1027:     ffnneennii           Enable interrupts, no operands
                   1028:     ffffrreeee   _s_t_1     Free register
                   1029:     ffiiaadddd   _d       Integer add
                   1030:     ffllaadddd   _d       Integer add, long
                   1031:     ffiiccoomm   _d       Integer compare
                   1032:     ffllccoomm   _d       Integer compare, long
                   1033:     ffiiccoommpp  _d       Integer compare and pop
                   1034:     ffllccoommpp  _d       Integer compare and pop, long
                   1035:     ffiiddiivv   _d       Integer divide
                   1036:     ffllddiivv   _d       Integer divide, long
                   1037:     ffiiddiivvrr  _d       Integer divide reversed
                   1038:     ffllddiivvrr  _d       Integer divide, long reversed
                   1039:     ffiilldd    _d       Integer load
                   1040:     fflllldd    _d       Integer load, long
                   1041:     ffqqlldd    _d       Integer load, quad
                   1042:     ffiimmuull   _d       Integer multiply
                   1043:     ffllmmuull   _d       Integer multiply, long
                   1044:     ffiinnccssttpp         Increment stack pointer
                   1045:     ffiinniitt           Initialize processor
                   1046:     ffnniinniitt          Initialize processor
                   1047:     ffiisstt    _d       Integer store
                   1048:     ffllsstt    _d       Integer store, long
                   1049:     ffiissttpp   _d       Integer store and pop
                   1050:     ffllssttpp   _d       Integer store and pop, long
                   1051:     ffqqssttpp   _d       Integer store and pop, quad
                   1052: 
                   1053: 
                   1054: COHERENT Lexicon                                          Page 16
                   1055: 
                   1056: 
                   1057: 
                   1058: 
                   1059: as                           Command                           as
                   1060: 
                   1061: 
                   1062: 
                   1063:     ffiissuubb   _d       Integer subtract
                   1064:     ffllssuubb   _d       Integer subtract, long
                   1065:     ffiissuubbrr  _d       Integer subtract reversed
                   1066:     ffllssuubbrr  _d       Integer subtract reversed, long
                   1067:     fflldd     _s_t_1     Load real
                   1068:     fffflldd    _d       Load real, float
                   1069:     ffddlldd    _d       Load real, double
                   1070:     ffttlldd    _d       Load real, temp
                   1071:     ffllddccww   _d       Load control word
                   1072:     ffllddeennvv  _d       Load environment
                   1073:     ffllddllgg22          Load log(10)2
                   1074:     ffllddllnn22          Load log(e)2
                   1075:     ffllddll22ee          Load log(2)e
                   1076:     ffllddll22tt          Load log(2)10
                   1077:     ffllddppii           Load pi
                   1078:     ffllddzz            Load +0.0
                   1079:     fflldd11            Load +1.0
                   1080:     ffmmuull            Multiply real
                   1081:     ffmmuull    _s_t_0, _s_t_1Multiply real
                   1082:     ffffmmuull   _s_t_1, _s_t_0Multiply real, float
                   1083:     ffddmmuull   _d       Multiply real, double
                   1084:     ffmmuullpp   _d       Multiply real and pop
                   1085:     ffnnoopp    st1     No operation
                   1086:     ffppaattaann          Partial arctangent
                   1087:     ffpprreemm           Partial remainder
                   1088:     ffppttaann           Partial tangent
                   1089:     ffrrnnddiinntt         Round to integer
                   1090:     ffrrssttoorr  _d       Restore saved state
                   1091:     ffssaavvee   _d       Save state
                   1092:     ffnnssaavvee  _d       Save state
                   1093:     ffssccaallee          Scale
                   1094:     ffsseettppmm          Set protected mode
                   1095:     ffssqqrrtt           Square root
                   1096:     ffsstt     _s_t_1     Store real
                   1097:     ffffsstt    _d       Store real, float
                   1098:     ffddsstt    _d       Store real, double
                   1099:     ffssttccww   _d       Store control word
                   1100:     ffnnssttccww  _d       Store control word
                   1101:     ffsstteennvv  _d       Store environment
                   1102:     ffnnsstteennvv _d       Store environment
                   1103:     ffssttpp    _s_t_1     Store real and pop
                   1104:     ffffssttpp   _d       Store real and pop, float
                   1105:     ffddssttpp   _d       Store real and pop, double
                   1106:     ffttssttpp   _d       Store real and pop, temp
                   1107:     ffssttssww   _d       Store status word
                   1108:     ffnnssttssww  _d       Store status word
                   1109:     ffssuubb    _s_t_0, _s_t_1Subtract real
                   1110:     ffssuubb    _s_t_1, _s_t_0Subtract real
                   1111:     ffffssuubb   _d       Subtract real, float
                   1112:     ffddssuubb   _d       Subtract real, double
                   1113:     ffssuubbpp           Subtract real and pop
                   1114:     ffssuubbpp   _s_t_1     Subtract real and pop
                   1115:     ffssuubbrr   _d       Subtract real reversed
                   1116:     ffffssuubbrr  _d       Subtract real reversed, float
                   1117:     ffddssuubbrr  _d       Subtract real reversed, double
                   1118: 
                   1119: 
                   1120: COHERENT Lexicon                                          Page 17
                   1121: 
                   1122: 
                   1123: 
                   1124: 
                   1125: as                           Command                           as
                   1126: 
                   1127: 
                   1128: 
                   1129:     ffssuubbrrpp          Subtract real reversed and pop
                   1130:     ffssuubbrrpp  _s_t_1     Subtract real reversed and pop
                   1131:     ffttsstt            Test stack top against +0.0
                   1132:     ffwwaaiitt           Wait while 8087 is busy
                   1133:     ffxxaamm            Examine stack top
                   1134:     ffxxcchh    _s_t_1     Exchange registers
                   1135:     ffxxcchh            Exchange registers
                   1136:     ffxxttrraacctt         Extract exponent and significance
                   1137:     ffyyll22xx           Y*log(2)X
                   1138:     ffyyll22xxpp11         Y*log(2)(X+1)
                   1139: 
                   1140: ***** C Compiler Conventions *****
                   1141: 
                   1142: as is often used to  write small functions that perform tasks not
                   1143: easily or efficiently done  in C.  Such functions are intended to
                   1144: be called  from a  C program.  As  long as the  assembly language
                   1145: source code  follows compiler conventions,  the assembler routine
                   1146: will be fully compatible with C functions.  These conventions are
                   1147: (1) the names of external variables and (2) calling functions.
                   1148: 
                   1149: ***** Naming Conventions *****
                   1150: 
                   1151: The C  compiler appends an underline character `_'  to the end of
                   1152: every external  declared in a  C source file.   When referring to
                   1153: any external  variable or function  declared in a  C source file,
                   1154: append  an underscore  to the  name.  In  a similar  manner, when
                   1155: defining a  function or variable  in an assembly  language source
                   1156: file that is  to be accessed from a C  source file, append an un-
                   1157: derline character.
                   1158: 
                   1159: ***** Function-Calling Conventions *****
                   1160: 
                   1161: Function-calling conventions  deal with how  arguments are passed
                   1162: to functions,  how values are  returned, and which  registers are
                   1163: used for special purposes and must be protected.
                   1164: 
                   1165: ***** Arguments *****
                   1166: 
                   1167: Function arguments  are passed on the stack.   They are pushed by
                   1168: the calling  function, which also  removes them when   the called
                   1169: function returns.   Looking at  the declaration of  the function,
                   1170: the order in  which they are pushed onto the  stack is from right
                   1171: to  left; that  is, the  C compiler pushes  the argument  list in
                   1172: reverse order  of declaration.  The  instruction call to  jump to
                   1173: the function  also pushes  the return  address, so that  when the
                   1174: called routine  gains control the first argument  is found at of-
                   1175: fset 2 from the stack pointer.
                   1176: 
                   1177: Integer  and pointer  arguments  are word  size,  and are  simply
                   1178: pushed with a  push instruction.  Characters, although byte size,
                   1179: are  not passed  as  bytes.  The  C language  requires that  char
                   1180: variables be  promoted to the type int  before being passed.  The
                   1181: promotion is  signed or  unsigned, depending  on the type  of the
                   1182: char variable.  lloonnggs are pushed  one word at a time; the higher-
                   1183: address word is pushed first.  This ensures that the words of the
                   1184: 
                   1185: 
                   1186: COHERENT Lexicon                                          Page 18
                   1187: 
                   1188: 
                   1189: 
                   1190: 
                   1191: as                           Command                           as
                   1192: 
                   1193: 
                   1194: 
                   1195: long are  in the  correct order on  the stack, because  the stack
                   1196: grows toward low-addressed memory.
                   1197: 
                   1198: Passing ffllooaatts, ddoouubbllees, or structure arguments is more involved.
                   1199: C requires  ffllooaatts to be  promoted to and passed  as ddoouubbllees,  so
                   1200: this conversion must  be performed first.  ddoouubbllees and structures
                   1201: are passed so that as they sit on the stack, all bytes are in the
                   1202: correct order;  this is analogous to the  passing of lloonnggs.  This
                   1203: means, for  example, that  ddoouubbllees may  be pushed with  four push
                   1204: word instructions,  beginning with the highest  addressed word in
                   1205: the 64-bit double, and ending with the lowest addressed word.
                   1206: 
                   1207: If in doubt about how to  apply any of this, try writing a simple
                   1208: C program that uses what you  need, and compile it with the -vasm
                   1209: option  to the  cc command.   This produces  an assembly-language
                   1210: version of  the C  program, which can  be studied to  see exactly
                   1211: what the compiler does, and mimicked to good effect.
                   1212: 
                   1213: ***** Return Values *****
                   1214: 
                   1215: 
                   1216: Functions return  values in various registers  according to their
                   1217: type.  iinntts and pointers  are returned in the ax register.  cchhaarrs
                   1218: are returned  by first promoting  them to iinntts  and returning the
                   1219: result in the ax register; effectively, this means that cchhaarrs are
                   1220: returned in  the al  register.  lloonnggs  are returned in  the dx:ax
                   1221: register pair, with  the most significant word (also the high-ad-
                   1222: dress word) in the dx register, and the least significant word in
                   1223: the ax register.
                   1224: 
                   1225: ffllooaatts, ddoouubbllees,  and structures are  returned in a  more complex
                   1226: fashion.  C  requires ffllooaatts be returned as  ddoouubbllees, so they are
                   1227: converted.  ddoouubbllees  are returned  in a special  eight-byte array
                   1228: named _ffppaacc (of course, in assembly language the name is _ffppaacc_).
                   1229: This array is defined by the compiler.  In the event that a func-
                   1230: tion returns a structure, the contents of the structure are saved
                   1231: in memory,  and the function returns a  pointer to that structure
                   1232: in the  ax register.  The  calling function then  moves the bytes
                   1233: into the actual destination.
                   1234: 
                   1235: Again, if in doubt about how to do this in assembly language, try
                   1236: compiling a function with assembly language output to see how the
                   1237: compiler does it.
                   1238: 
                   1239: ***** Important Registers *****
                   1240: 
                   1241: Every function must preserve  the value of the bp register, which
                   1242: is the caller's stack frame pointer.  Also, the compiler uses the
                   1243: si  and di  registers  for register  variables, so  they must  be
                   1244: preserved.
                   1245: 
                   1246: ***** Example of an Assembly Language Program *****
                   1247: 
                   1248: The following  assembly language file, strchar.s  defines a func-
                   1249: tion strchar that returns  the number of occurrences of a charac-
                   1250: 
                   1251: 
                   1252: COHERENT Lexicon                                          Page 19
                   1253: 
                   1254: 
                   1255: 
                   1256: 
                   1257: as                           Command                           as
                   1258: 
                   1259: 
                   1260: 
                   1261: ter in a string.
                   1262: 
                   1263: 
                   1264: FILE: strchar.s
                   1265: 
                   1266:     /
                   1267:     /
                   1268:     /  Count and return the occurrences
                   1269:     /  of a character in a string.
                   1270:     /
                   1271:     /     int
                   1272:     /     strchar(s, c)
                   1273:     /     char *s;
                   1274:     /     int c;
                   1275:     /
                   1276:     /
                   1277: 
                   1278: 
                   1279: 
                   1280:         .globl     strchar_   / Make the name known externally.
                   1281: 
                   1282:         strchar_:
                   1283:              push    si         / Standard C function
                   1284:              push    di         / linkage. Save the
                   1285:              push    bp         / si, di, and bp registers
                   1286:              mov     bp, sp     / and set up new frame pointer.
                   1287: 
                   1288: 
                   1289: 
                   1290:              mov     si, 8(bp)  / String ptr -> si.
                   1291:              mov     bx, 10(bp) / Char -> bx (actually bl).
                   1292:              sub     ax, ax     / Clear ax (count register).
                   1293:              sub     cx, cx     / Clear cx.
                   1294: 
                   1295: 
                   1296: 
                   1297:         0:   movb    cl, (si)   / Get character from string.
                   1298:              jcxz    2f         / End of string?
                   1299:              cmpb    bl, cl     / No. Do chars match?
                   1300:              jnz     1f         / No.
                   1301:              inc     ax         / Yes. Increment count.
                   1302: 
                   1303: 
                   1304: 
                   1305:         1:   inc     si         / Bump string pointer
                   1306:              jmp     0b         / and loop again.
                   1307: 
                   1308: 
                   1309: 
                   1310:         2:   pop     bp         / Standard C return
                   1311:              pop     di         / linkage. Restore
                   1312:              pop     si         / saved registers and
                   1313:              ret                / go home.
                   1314: 
                   1315: 
                   1316: 
                   1317: 
                   1318: COHERENT Lexicon                                          Page 20
                   1319: 
                   1320: 
                   1321: 
                   1322: 
                   1323: as                           Command                           as
                   1324: 
                   1325: 
                   1326: 
                   1327: 
                   1328: The following  C program, main.c  uses strchar The  assembly lan-
                   1329: guage listing  that follows, main.s  was produced from  main.c by
                   1330: the -vasm  option in cc.   The listing has been  edited, and com-
                   1331: ments added, to illustrate what is happening.
                   1332: 
                   1333: 
                   1334: FILE: main.c
                   1335: 
                   1336:         main()
                   1337:         {
                   1338:             int n;
                   1339:             n = strchar("aardvark", 'a');
                   1340:         }
                   1341: 
                   1342: 
                   1343: 
                   1344: FILE: main.s
                   1345: 
                   1346:               .shri                / ``code'' program section.
                   1347: 
                   1348:               .globl   main_
                   1349: 
                   1350: 
                   1351: 
                   1352:         main_:
                   1353: 
                   1354:               .strn                / ``string'' program section.
                   1355: 
                   1356: 
                   1357: 
                   1358:         L2:   .byte    0x61        / This is the string
                   1359:               .byte    0x61        / ``aardvark''
                   1360:               .byte    0x72
                   1361:               .byte    0x64
                   1362:               .byte    0x76
                   1363:               .byte    0x61
                   1364:               .byte    0x72
                   1365:               .byte    0x6B
                   1366:               .byte    0x00
                   1367: 
                   1368: 
                   1369: 
                   1370:               .shri                / Back to ``code''
                   1371: 
                   1372:               push  si             / Standard C function
                   1373:               push  di             / linkage.  Save registers,
                   1374:               push  bp             / set up new frame pointer (bp),
                   1375:               mov   bp, sp         / and make room on stack
                   1376:               sub   sp, $0x02      / for the auto int, ``n''
                   1377: 
                   1378: 
                   1379: 
                   1380: 
                   1381: 
                   1382: 
                   1383: 
                   1384: COHERENT Lexicon                                          Page 21
                   1385: 
                   1386: 
                   1387: 
                   1388: 
                   1389: as                           Command                           as
                   1390: 
                   1391: 
                   1392: 
                   1393:               mov   ax, $0x61      / Push the
                   1394:               push  ax             / character `a'.
                   1395:               mov   ax, $L2        / Push the address
                   1396:               push  ax             / of the string ``aardvark''
                   1397:               call  strchar_       / Function call.
                   1398:               add   sp, $0x04      / Remove args from stack.
                   1399:               mov   -0x02(bp), ax  / Assign result to auto `n'.
                   1400: 
                   1401: 
                   1402: 
                   1403:               mov   sp, bp         / Standard C return
                   1404:               pop   bp             / linkage.  Adjust stack
                   1405:               pop   di             / pointer, then restore
                   1406:               pop   si             / registers and
                   1407:               ret                  / go home.
                   1408: 
                   1409: 
                   1410: ***** Diagnostics *****
                   1411: 
                   1412: All errors  detected by the assembler are  reported on the screen
                   1413: as an error message that is tagged with a line number.  If a sym-
                   1414: bol is associated with the  error message (for example, if a sym-
                   1415: bol is undefined), then the symbol's name is also given.  If more
                   1416: than one  input file appears on the  command line, error messages
                   1417: are tagged with the name of the source file.
                   1418: 
                   1419: If a listing is generated,  errors are reported on the listing in
                   1420: the same  format, with the  error flags at the  left margin.  The
                   1421: total number of  errors is displayed on the screen  at the end of
                   1422: the assembly.
                   1423: 
                   1424: For a full listing of aass error messages, see the tutorial for the
                   1425: C compiler, which appears earlier in this manual.
                   1426: 
                   1427: ***** See Also *****
                   1428: 
                   1429: cc, commands
                   1430: 
                   1431: 
                   1432: 
                   1433: 
                   1434: 
                   1435: 
                   1436: 
                   1437: 
                   1438: 
                   1439: 
                   1440: 
                   1441: 
                   1442: 
                   1443: 
                   1444: 
                   1445: 
                   1446: 
                   1447: 
                   1448: 
                   1449: 
                   1450: COHERENT Lexicon                                          Page 22
                   1451: 
                   1452: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.