


as86(1)                                                   as86(1)


NAME
       as86 - Assembler for 8086..80386 processors

SYNOPSIS
       as86 [-0123agjuw] [-lm[list]] [-n name] [-o obj] [-b[bin]]
       [-s sym] src

       as86_encap prog.s prog.v [prefix_] [as86 options]


DESCRIPTION
       as86 is an assembler for the 8086..80386 processors,  it's
       syntax  is  closer to the intel/microsoft form rather than
       the more normal generic form of the unix system assembler.

       The src file can be '-' to assemble the standard input.

       This assembler can be compiled to support the 6809 cpu and
       may even work.

       as86_encap is a shell script to call as86 and convert  the
       created  binary  into a C file prog.v to be included in or
       linked with programs  like  boot  block  installers.   The
       prefix_  argument is a prefix to be added to all variables
       defined by the source, it defaults  to  the  name  of  the
       source  file.  The  variables defined include prefix_start
       prefix_size and prefix_data  to  define  and  contain  the
       code,  plus integers containing the values of all exported
       labels.  Either or both the prog.s  and  prog.v  arguments
       can be '-' for standard in/out.



OPTIONS
       -0     start  with  16-bit  code  segment,  warn  for  all
              instructions > 8086

       -1     start  with  16-bit  code  segment,  warn  for  all
              instructions > 80186

       -2     start  with  16-bit  code  segment,  warn  for  all
              instructions > 80286

       -3     start with 32-bit code segment, don't warn for  any
              instructions. (not even 486 or 586)

       -a     enable  partial compatibility with Minix asld. This
              swaps the  interpretation  of  round  brackets  and
              square  brackets  as  well as making alterations to
              the code generation for 16bit jumps and calls.

       -g     only put global symbols in object or symbol file

       -j     replace short jumps that don't reach  with  5  byte



                            Jan, 1997                           1





as86(1)                                                   as86(1)


              sequences,  this  causes  the  assembler  to add an
              extra pass to try to determine if the long jump  is
              really needed. If you add a second -j the assembler
              will  keep  adding  passes  until  the  labels  all
              stabilise  (to  a  maximum  of 30 passes) Don't use
              this with hand written assembler use  the  explicit
              br bmi bcc  style  opcodes  for  8086  code  or the
              jmp near style for conditional i386 instructions.

       -l     produce list file, filename may follow

       -m     print macro expansions in listing

       -n     name of module follows (goes in object  instead  of
              source name)

       -o     produce object file, filename follows

       -b     produce  a  raw  binary  file, filename may follow.
              This is a 'raw' binary  file  with  no  header,  if
              there's no -s option the file starts at location 0.

       -s     produce an ASCII  symbol  file,  filename  follows.
              The  format of this table is designed to be easy to
              parse for encapsulation and related  activities  in
              relation  to  binary  files  created  with  the  -b
              option.  If a binary file doesn't start at location
              zero the first two items in the table are the start
              and end addresses of the binary file.

       -u     take undefined symbols as imported-with-unspecified
              segment

       -w     don't print warnings


AS86 SOURCE
       Special characters

       *      Address of the start of the current line.

       ; !    Either  of  these  marks the start of a comment. In
              addition any 'unexpected' character at the start of
              a line is assumed to be a comment.

       #      Prefix for immediate operands.

       $      Prefix  for  hexadecimal  numbers,  the 'C' syntax,
              eg 0x1234, is also accepted.

       %      Prefix for binary numbers.

       [ ]    Specifies an indirect operand.
              Offsets from registers are  represented  by  adding



                            Jan, 1997                           2





as86(1)                                                   as86(1)


              the  register  to  the  expression  inside  the [ ]
              brackets. eg:
                   MOV AX,[BX+Table]

       Conditionals

       IF, ELSE, ELSEIF, ENDIF
              Numeric condition

       IFC, ELSEIFC
              String compare (str1,str2)

       FAIL .FAIL
              Generate user error.

       Segment related

       .TEXT .ROM .DATA .BSS
              Set current segment. These can be preceded  by  the
              keyword .SECT

       LOC    Set numeric segment 0=TEXT, 3=DATA,ROM,BSS, 15=MAX.
              Only segment zero  is  in  the  text  segment,  all
              others are data.

       Label type definition

       EXPORT PUBLIC .DEFINE
              Export label defined in this object

       ENTRY  Force linker to include label in a.out

       .GLOBL .GLOBAL
              Define  label  as external and force import even if
              it isn't used.

       EXTRN EXTERN IMPORT .EXTERN
              Import list of externally defined labels
              NB: It doesn't make sense to use  imports  for  raw
              binary files.

       .ENTER Mark entry for old binary file (obs)

       Data definition

       DB .DATA1 .BYTE FCB
              List of 1 byte objects.

       DW .DATA2 .SHORT FDB .WORD
              List of 2 byte objects.

       DD .DATA4 .LONG
              List of 4 byte objects.




                            Jan, 1997                           3





as86(1)                                                   as86(1)


       .ASCII FCC
              Ascii string copied to output.

       .ASCIZ Ascii  string  copied  to  output with trailing nul
              byte.

       Space definition

       .BLKB RMB .SPACE
              Space is counted in bytes.

       .BLKW .ZEROW
              Space is counted in words. (2 bytes each)

       COMM .COMM LCOMM .LCOMM
              Common area data definition

       Other useful pseudo operations.

       .ALIGN .EVEN
              Alignment

       EQU    Define label

       SET    Define re-definable label

       ORG .ORG
              Set assemble location

       BLOCK  Set assemble location and stack old one

       ENDB   Return to stacked assemble location

       GET INCLUDE
              Insert new file (no quotes on name)

       USE16 [cpu]
              Define default operand size as 16 bit, argument  is
              cpu  type  the code is expected to run on (86, 186,
              286, 386, 486, 586)  instructions  for  cpus  later
              than specified give a warning.

       USE32 [cpu]
              Define  default operand size as 32 bit, argument is
              cpu type the code is expected to run on  (86,  186,
              286,  386,  486,  586)  instructions for cpus later
              than specified give a warning. If the  cpu  is  not
              mentioned the assembler ensures it is >= 80386.

       END    End of compilation for this file.

       .WARN  Switch warnings

       .LIST  Listings on/off (1,-1)



                            Jan, 1997                           4





as86(1)                                                   as86(1)


       .MACLIST
              Macro listings on/off (1,-1)

       Macros, now working, the general form is like this.

           MACRO sax
              mov ax,#?1
           MEND
           sax(1)


       Unimplemented/unused.

       IDENT  Define object identity string.

       SETDP  Set DP value on 6809

       MAP    Set binary symbol table map number.

       Registers
              BP BX DI SI
              EAX EBP EBX ECX EDI EDX ESI ESP
              AX CX DX SP
              AH AL BH BL CH CL DH DL
              CS DS ES FS GS SS
              CR0 CR2 CR3 DR0 DR1 DR2 DR3 DR6 DR7
              TR3 TR4 TR5 TR6 TR7 ST

       Operand type specifiers
              BYTE  DWORD  FWORD  FAR  PTR PWORD QWORD TBYTE WORD
              NEAR

       General instructions understood.
              AAA AAD AAM AAS ADC ADD AND ARPL BCC  BCS  BEQ  BGE
              BGT BHI BHIS BLE BLO BLOS BLT BMI BNE BOUND BPC BPL
              BPS BR BVC BVS CALL CALLF CALLI CBW CLC CLD CLI CMC
              CMP  CMPS  CMPSB CMPSD CMPSW CMPW CSEG CWD CWDE CDQ
              DAA DAS DSEG DEC DIV ENTER ESEG FSEG GSEG HLT  IDIV
              IMUL  IN  INC  INS INSB INSD INSW INT INTO INW IRET
              IRETD J JA JAE JB JBE JC JCXE JCXZ JECXE  JECXZ  JE
              JG  JGE  JL JLE JMP JMPF JMPI JNA JNAE JNB JNBE JNC
              JNE JNG JNGE JNL JNLE JNO JNP JNS JNZ JO JP JPE JPO
              JS  JZ  LAHF LDS LEA LEAVE LES LOCK LODB LODS LODSB
              LODSD LODSW LODW LOOP LOOPE LOOPNE LOOPNZ LOOPZ MOV
              MOVS  MOVSB MOVSD MOVSW MOVW MUL NEG NOP NOT OR OUT
              OUTS OUTSB OUTSD OUTSW OUTW  POP  POPA  POPAD  POPF
              POPFD  PUSH  PUSHA  PUSHAD PUSHF PUSHFD RCL RCR ROL
              ROR REP REPE REPNE REPNZ REPZ RET  RETF  RETI  SAHF
              SAL  SAR  SBB  SCAB SCAS SCASB SCASD SCASW SCAW SEG
              SHL SHR SSEG STC STD  STI  STOB  STOS  STOSB  STOSD
              STOSW STOW SUB TEST WAIT XCHG XLAT XLATB XOR

       And more...
              BSF  BSR  BSWAP  BT  BTC  BTR BTS CLTS CMPXCHG INVD



                            Jan, 1997                           5





as86(1)                                                   as86(1)


              INVLPG LAR LFS LGDT LGS LIDT LLDT LMSW LSL LSS  LTR
              MOVSX  MOVZX  SETA  SETAE SETB SETBE SETC SETE SETG
              SETGE SETL SETLE SETNA SETNAE  SETNB  SETNBE  SETNC
              SETNE  SETNG  SETNGE SETNL SETNLE SETNO SETNP SETNS
              SETNZ SETO SETP SETPE SETPO  SETS  SETZ  SGDT  SIDT
              SHLD  SHRD SLDT SMSW STR VERR VERW WBINVD XADD ADCB
              ADDB ANDB CMPB DECB DIVB IDIVB IMULB INB INCB  MOVB
              MULB  NEGB  NOTB  ORB OUTB RCLB RCRB ROLB RORB SALB
              SARB SHLB SHRB SBBB SUBB TESTB XCHGB XORB

       Floating point
              F2XM1 FABS FADD FADDP FBLD FBSTP  FCHS  FCLEX  FCOM
              FCOMP  FCOMPP  FCOS  FDECSTP FDISI FDIV FDIVP FDIVR
              FDIVRP FENI FFREE FIADD FICOM FICOMP  FIDIV  FIDIVR
              FILD  FIMUL  FINCSTP  FINIT FIST FISTP FISUB FISUBR
              FLD FLD1 FLDL2E FLDL2T FLDCW FLDENV  FLDLG2  FLDLN2
              FLDPI  FLDZ  FMUL  FMULP FNCLEX FNDISI FNENI FNINIT
              FNOP FNSAVE  FNSTCW  FNSTENV  FNSTSW  FPATAN  FPREM
              FPREM1  FPTAN  FRNDINT  FRSTOR  FSAVE FSCALE FSETPM
              FSIN FSINCOS FSQRT FST FSTCW FSTENV FSTP FSTSW FSUB
              FSUBP  FSUBR FSUBRP FTST FUCOM FUCOMP FUCOMPP FWAIT
              FXAM FXCH FXTRACT FYL2X FYL2XP1


Using GASP
       The Gnu assembler preprocessor  provides  some  reasonable
       implementations of user biased pseudo opcodes.

       It can be invoked in a form similar to:

       gasp   [-a...]  file.s [file2.s] |
              as86 [...]  - [-o obj] [-b bin]

       Be  aware  though  that  Gasp  generates an error for .org
       commands, if you're not using alternate syntax you can use
       org  instead, otherwise use block and endb.  The directive
       export is translated into .global, which forces an import,
       if  you  are  making a file using -b use public or .define
       instead.

       The GASP list options have no support in as86.

SEE ALSO
       as(1), ld86(1), bcc(1)

BUGS
       The 6809 version does not support -0, -3, -a or -j.

       If this assembler is compiled with BCC this is classed  as
       a  'small'  compiler,  so  there  is  a maximum input line
       length of  256  characters  and  the  instruction  to  cpu
       checking is not included.

       The  checking  for instructions that work on specific cpus



                            Jan, 1997                           6





as86(1)                                                   as86(1)


       is probably not complete, the  distinction  between  80186
       and 80286 is especially problematic.

       The  .text  and  .data pseudo operators are not useful for
       raw binary files.

       When using the org directive the  assembler  can  generate
       object files that may break ld86(1).

















































                            Jan, 1997                           7


