


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

       -g     only put global symbols in object or symbol file

       -j     replace  short  jumps  that don't reach with 5 byte
              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



                            Jan, 1997                           1





as86(1)                                                   as86(1)


              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
              the register to  the  expression  inside  the  [  ]
              brackets. eg:
                   MOV AX,[BX+Table]



                            Jan, 1997                           2





as86(1)                                                   as86(1)


       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.

       .ASCII FCC
              Ascii string copied to output.

       .ASCIZ Ascii string copied to  output  with  trailing  nul



                            Jan, 1997                           3





as86(1)                                                   as86(1)


              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)

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




                            Jan, 1997                           4





as86(1)                                                   as86(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
              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



                            Jan, 1997                           5





as86(1)                                                   as86(1)


              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
       is  probably  not  complete, the distinction between 80186
       and 80286 is especially problematic.




                            Jan, 1997                           6





as86(1)                                                   as86(1)


       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


