man pages section 1: User Commands

Exit Print View

Updated: July 2014
 
 

as86 (1)

Name

as86 - Assembler for 8086..80386 processors

Synopsis

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

as86_encap prog.s prog.v [prefix_] [as86_options]

Description




User Commands                                             as86(1)



NAME
     as86 - Assembler for 8086..80386 processors

SYNOPSIS
     as86  [-0123agjuw]  [-lm[list]] [-n name] [-o obj] [-b[bin]]
     [-s sym] [-t textseg] 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  and syntax for 16bit jumps and calls. ("jmp
          @(bx)" is then a valid instruction)




SunOS 5.11            Last change: Mar, 1999                    1






User Commands                                             as86(1)



     -g   only put global symbols in object or symbol file

     -j   replace all short jumps  with  similar  16  or  32  bit
          jumps, the 16 bit conditional branches are encoded as a
          short conditional and a long unconditional branch.

     -O   this causes the assembler to add extra passes to try to
          use  forward  references to reduce the bytes needed for
          some instructions.  If the labels move on the last pass
          the  assembler will keep adding passes until the labels
          all stabilise (to a maximum of 30 passes) It's probably
          not a good idea to 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
          and make sure all variables are defined before they are
          used.

     -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   assume undefined symbols are  imported-with-unspecified
          segment.

     -w-  allow the assembler to print warning messages.

     -t n move all text segment data in segment n+3.

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



SunOS 5.11            Last change: Mar, 1999                    2






User Commands                                             as86(1)



          line  is  assumed  to  be  a  comment  (but  it's  also
          displayed to the terminal).

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

     %    Prefix for binary numbers.

     #    Prefix for immediate operands.

     [ ]  Specifies an indirect operand.
          Unlike  MASM  the  assembler has no type information on
          labels just a segment and offset. This means  that  the
          way  this  operator  and  the immediate prefix work are
          like traditional assemblers.

          Examples:
               mov     ax,bx
               jmp     bx
          Direct register addressing, the jump copies BX into PC.

               mov ax,[bx]
               jmp [bx]
          Simple indirect register addressing, the jump moves the
          contents of the location specified by BX into the PC.

               mov ax,#1234
          Immediate value, ax becomes 1234.

               mov ax,1234
               mov ax,_hello
               mov ax,[_hello]
          Absolute addressing, ax is set to contents of  location
          1234.  Note the third option is not strictly consistant
          but is in place mainly for asld compatibility.


               mov ax,_table[bx]
               mov ax,_table[bx+si]
               mov eax,_table[ebx*4]

               mov ax,[bx+_table]
               mov ax,[bx+si+_table]
               mov eax,[ebx*4+_table]
          Indexed addressing, both formats are ok,  I  think  the
          first  is  more  correct but I tend to used the second.
          :-)

     Conditionals

     IF, ELSE, ELSEIF, ENDIF
          Numeric condition



SunOS 5.11            Last change: Mar, 1999                    3






User Commands                                             as86(1)



     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, 14=MAX.
          The  segment  order  set   by   the   linker   is   now
          0,4,5,6,7,8,9,A,B,C,D,E,1,2,3.    Segment   0  and  all
          segments above 3 are assumed to be text segment.   Note
          the  64k size restrictions are not imposed for segments
          3-14.

     Label type definition

     EXPORT PUBLIC .DEFINE
          Export label defined in this object

     ENTRY
          Force linker to include the specified 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.



SunOS 5.11            Last change: Mar, 1999                    4






User Commands                                             as86(1)



     .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




SunOS 5.11            Last change: Mar, 1999                    5






User Commands                                             as86(1)



     .LIST
          Listings on/off (1,-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

          The   'near   and  'far'  do  not  allow  multi-segment
          programming,  all  'far'   operations   are   specified
          explicitly  through  the use of the instructions: jmpi,
          jmpf, callf, retf, etc. The 'Near' operator can be used
          to  force  the use of 80386 16bit conditional branches.
          The 'Dword' and 'word' operators can control  the  size
          of operands on far jumps and calls.

     General instructions.
          These are in general the same as the instructions found
          in any 8086 assembler, the main exceptions being a  few
          'Bcc'  (BCC,  BNE,  BGE,  etc)  instructions  which are
          shorthands for a short branch plus a long jump and 'BR'
          which is the longest unconditional jump (16 or 32 bit).

     Long branches



SunOS 5.11            Last change: Mar, 1999                    6






User Commands                                             as86(1)



          BCC BCS BEQ BGE BGT BHI BHIS BLE BLO BLOS BLT  BMI  BNE
          BPC BPL BPS BVC BVS BR

     Intersegment
          CALLI CALLF JMPI JMPF

     Segment modifier instructions
          ESEG FSEG GSEG SSEG

     Byte operation instructions
          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

     Standard instructions
          AAA AAD AAM AAS ADC ADD AND ARPL BOUND BSF BSR BSWAP BT
          BTC BTR BTS CALL CBW CDQ CLC CLD CLI CLTS CMC CMP  CMPS
          CMPSB  CMPSD  CMPSW  CMPW CMPXCHG CSEG CWD CWDE DAA DAS
          DEC DIV DSEG ENTER HLT IDIV IMUL IN INC INS  INSB  INSD
          INSW  INT  INTO  INVD INVLPG INW IRET IRETD J JA JAE JB
          JBE JC JCXE JCXZ JE JECXE JECXZ JG JGE JL JLE  JMP  JNA
          JNAE JNB JNBE JNC JNE JNG JNGE JNL JNLE JNO JNP JNS JNZ
          JO JP JPE JPO JS JZ LAHF LAR LDS LEA LEAVE LES LFS LGDT
          LGS  LIDT  LLDT  LMSW  LOCK LODB LODS LODSB LODSD LODSW
          LODW LOOP LOOPE LOOPNE LOOPNZ LOOPZ  LSL  LSS  LTR  MOV
          MOVS MOVSB MOVSD MOVSW MOVSX MOVW MOVZX MUL NEG NOP NOT
          OR OUT OUTS OUTSB OUTSD OUTSW OUTW POP POPA POPAD  POPF
          POPFD  PUSH PUSHA PUSHAD PUSHF PUSHFD RCL RCR RDMSR REP
          REPE REPNE REPNZ REPZ RET RETF RETI ROL  ROR  SAHF  SAL
          SAR SBB SCAB SCAS SCASB SCASD SCASW SCAW SEG 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  SHL SHLD SHR SHRD SIDT SLDT SMSW STC STD STI STOB
          STOS STOSB STOSD STOSW STOW STR SUB TEST VERR VERW WAIT
          WBINVD WRMSR XADD XCHG XLAT XLATB XOR

     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.



SunOS 5.11            Last change: Mar, 1999                    7






User Commands                                             as86(1)



     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.


ATTRIBUTES
     See  attributes(5)  for  descriptions   of   the   following
     attributes:

     +---------------+------------------+
     |ATTRIBUTE TYPE | ATTRIBUTE VALUE  |
     +---------------+------------------+
     |Availability   | developer/bcc    |
     +---------------+------------------+
     |Stability      | Uncommitted      |
     +---------------+------------------+
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.

     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).




NOTES
     This  software  was   built   from   source   available   at



SunOS 5.11            Last change: Mar, 1999                    8






User Commands                                             as86(1)



     https://java.net/projects/solaris-userland.    The  original
     community       source       was       downloaded       from
     http://homepage.ntlworld.com/robert.debath/dev86/Dev86src-0.16.17.tar.gz

     Further information about this software can be found on  the
     open        source        community        website        at
     http://homepage.ntlworld.com/robert.debath/dev86/.
















































SunOS 5.11            Last change: Mar, 1999                    9