6/15/72                                                    AS (I)





NAME            as -- assembler



SYNOPSIS        as [ - ] name  ...
                             1


DESCRIPTION     as assembles the concatenation of name , .... as
                                                      1
                is based on the DEC-provided assembler PAL-11R

                [1], although it was coded locally.  Therefore,

                only the differences will be recorded.



                If the optional first argument - is used, all un-

                defined symbols in the assembly are treated as

                global.



                Character changes are:



                     for    use

                      @      *

                      #      $

                      ;      /



                In as, the character ";" is a logical new line;

                several operations may appear on one line if sep-

                arated by ";".  Several new expression operators

                have been provided:



                     \>     right shift (logical)

                     \<     left shift

                     *      multiplication

                     \/     division

                     %      remainder (no longer means "register")

                     !      one's complement

                     []     parentheses for grouping

                     ^      result has value of left, type of right



                For example location 0 (relocatable) can be writ-

                ten "0^."; another way to denote register 2 is

                "2^r0".



                All of the preceding operators are binary; if a

                left operand is missing, it is taken to be 0.

                The "!" operator adds its left operand to the

                one's complement of its right operand.



                There is a conditional assembly operation code

                different from that of PAL-11R (whose condition-

                als are not provided):



                     .if expression

                     ...

                     .endif



                If the expression evaluates to non-zero, the sec-

                tion of code between the ".if" and the ".endif"

                is assembled; otherwise it is ignored.  ".if"s

                may be nested.



                Temporary labels like those introduced by Knuth

                [2] may be employed.  A temporary label is de-

                fined as follows:



                     n:



                where n is a digit 0 ... 9.  Symbols of the form

                "nf" refer to the first label "n:" following the

                use of the symbol; those of the form "nb" refer

                to the last "n:".  The same "n" may be used many

                times.  Labels of this form are less taxing both

                on the imagination of the programmer and on the

                symbol table space of the assembler.



                The PAL-11R opcodes ".word", ".eot" and ".end"

                are redundant and are omitted.



                The symbols



                     r0 ... r5

                     fr0 ... fr5 (floating-point registers)

                     sp

                     pc

                     ac

                     mq

                     div

                     mul

                     lsh

                     ash

                     nor

                     csw

                     ..



                are predefined with appropriate values.  The sym-

                bol "csw" refers to the console switches.  ".."

                is the relocation constant and is added to each

                relocatable reference.  On a PDP-11 with reloca-

                tion hardware, its value is 0; on most systems

                without protection, its value is 40000(8).



                The new opcode "sys" is used to specify system

                calls.  Names for system calls are predefined.

                See section (II).



                The opcodes "bes" (branch on error set) and "bec"

                (branch on error clear) are defined to test the

                error status bit set on return from system calls.



                Strings of characters may be assembled in a way

                more convenient than PAL-11's ".ascii" operation

                (which is, therefore, omitted).  Strings are in-

                cluded between the string quotes "<" and ">":



                     <here is a string>



                Escape sequences exist to enter non graphic and

                other difficult characters.  These sequences are

                also effective in single and double character

                constants introduced by single (') and double (")

                quotes respectively.



                     use  for

                     \n   newline (012)

                     \0   NULL (000)

                     \>   >

                     \t   TAB (011)

                     \a   ACK (006)

                     \r   CR (015)

                     \p   ESC (033)

                     \\   \ (134)



                as provides a primitive segmentation facility.

                There are three segments: text, data and bss.

                The text segment is ordinarily used for code.

                The data segment is provided for initialized but

                variable data.  The bss segment cannot be ini-

                tialized, but symbols may be defined to lie

                within this segment.  In the future, it is ex-

                pected that the text segment will be write-

                protected and sharable.  Assembly begins in the

                text segment.  The pseudo-operations



                        .text

                        .data

                        .bss



                cause the assembler to switch to the text, data,

                or bss segment respectively.  Segmentation is

                useful at present for two reasons: Non-

                initialized tables and variables, if placed in

                the bss segment, occupy no space in the output

                file.  Also, alternative use of the text and data

                segments provides a primitive dual location-

                counter feature.



                In the output file, all text-segment information

                comes first, followed by all data-segment infor-

                mation, and finally bss information.  Within each

                segment, information appears in the order writ-

                ten.



                Note: since nothing explicit can be assembled

                into the bss segment, the usual appearance of

                this segment is in the following style:



                        .bss

                        var1:   .=.+2

                        tab1:   .=.+100.

                        ...



                That is, space is reserved but nothing explicit

                is placed in it.



                As is evident from the example, it is legal to

                assign to the location counter ".".  It is also

                permissible in segments other than ".bss".  The

                restriction is made, however, that the value so

                assigned must be defined in the first pass and it

                must be a value associated with the same segment

                as ".".



                The pseudo-op



                        .comm   symbol,expression



                makes symbol an undefined global symbol, and

                places the value of the expression in the value

                field of the symbol's definition.  Thus the above

                declaration is equivalent to



                        .globl  symbol

                        symbol = expression ^ symbol



                The treatment of such a symbol by the loader

                ld(I) is as follows: If another routine in the

                same load defines the symbol to be an ordinary

                text, data, bss, or absolute symbol, that defini-

                tion takes precedence and the symbol acts like a

                normal undefined external.  If however no other

                routine defines the symbol, the loader defines it

                as an external bss-segment symbol and reserves n

                bytes after its location, where n is the value of

                the expression in the .comm operation.  Thus

                ".comm x,100" effectively declares x to be a com-

                mon region 100 bytes long.  Note: all such decla-

                rations for the same symbol in various routines

                should request the same amount of space.



                The binary output of the assembler is placed on

                the file "a.out" in the current directory.  a.out

                also contains the symbol table from the assembly

                and relocation bits.  The output of the assembler

                is executable immediately if the assembly was

                error-free and if there were no unresolved exter-

                nal references.  The link editor ld may be used

                to combine several assembly outputs and resolve

                global symbols.



                The assembler does not produce a listing of the

                source program.  This is not a serious drawback;

                the debugger db discussed below is sufficiently

                powerful to render a printed octal translation of

                the source unnecessary.



                On the last pages of this section is a list of

                all the assembler's built-in symbols.  In the

                case of instructions, the addressing modes are as

                follows:



                        src, dst        source, destination

                        r               general register

                        fsrc,fdst       floating source, destination

                        fr              floating register

                        exp             expression



                The names of certain 11/45 opcodes are different

                from those in the 11/45 manual; some were changed

                to avoid conflict with EAE register names, others

                to draw analogies with existing 11/20 instruc-

                tions.



FILES           /etc/as2        pass 2 of the assembler

                /tmp/atm1?      temporary

                /tmp/atm2?      temporary

                /tmp/atm3?      temporary

                a.out           object



SEE ALSO        ld(I), nm(I), sh(I), un(I), db(I), a.out(V),

                fptrap(III), [1] PAL-11R Assembler; DEC-11-ASDB-

                D, [2] Knuth, The Art of Computer Programming,

                Vol. I; Fundamental Algorithms.



DIAGNOSTICS     When an input file cannot be read, its name fol-

                lowed by a question mark is typed and assembly

                ceases.  When syntactic or semantic errors occur,

                a single-character diagnostic is typed out to-

                gether with the line number and the file name in

                which it occurred.  Errors in pass 1 cause can-

                cellation of pass 2.  The possible errors are:



                )  parentheses error

                ]  parentheses error

                <  String not terminated properly

                *  Indirection ("*") used illegally

                .  Illegal assignment to "."

                A  error in Address

                B  Branch instruction is odd or too remote

                E  error in Expression

                F  error in local ("F" or "b") type symbol

                G  Garbage (unknown) character

                I  End of file inside an If

                M  Multiply defined symbol as label

                O  Odd-- word quantity assembled at odd address

                P  Phase error-- "." different in pass 1 and 2

                R  Relocation error

                U  Undefined symbol

                X  syntaX error



BUGS            Symbol table overflow is not checked.



                If "." is moved backwards by an odd number of

                bytes, relocation bits are corrupted.



OWNER           dmr



                Special variables:



                     .

                     ..



                Register:



                     r0

                     r1

                     r2

                     r3

                     r4

                     r5

                     sp

                     pc

                     fr0

                     fr1

                     fr2

                     fr3

                     fr4

                     fr5



                Eae & switches:



                     csw

                     div

                     ac

                     mq

                     mul

                     sc

                     sr

                     nor

                     lsh

                     ash



                System calls:



                     exit

                     fork

                     read

                     write

                     open

                     close

                     wait

                     creat

                     link

                     unlink

                     exec

                     chdir

                     time

                     makdir

                     chmod

                     chown

                     break

                     stat

                     seek

                     tell

                     mount

                     umount

                     setuid

                     getuid

                     stime

                     quit

                     intr

                     fstat

                     cemt

                     mdate

                     stty

                     gtty

                     ilgins

                     hog



                Double operand:



                     mov     src,dst

                     movb       "

                     cmp        "

                     cmpb       "

                     bit        "

                     bitb       "

                     bic        "

                     bicb       "

                     bis        "

                     bisb       "

                     add        "

                     sub        "



                Branch:



                     br

                     bne

                     beq

                     bge

                     blt

                     bgt

                     ble

                     bpl

                     bmi

                     bhi

                     blos

                     bvc

                     bvs

                     bhis

                     bec     (= bcc)

                     bcc

                     blo

                     bcs

                     bes     (= bcs)





                     clr     dst

                     clrb     "

                     com      "

                     comb     "

                     inc      "

                     incb     "

                     dec      "

                     decb     "

                     neg      "

                     negb     "

                     adc      "

                     adcb     "

                     sbc      "

                     sbcb     "

                     ror      "

                     rorb     "

                     rol      "

                     rolb     "

                     asr      "

                     asrb     "

                     asl      "

                     aslb     "

                     jmp      "

                     swab     "

                     tst     src

                     tstb    src



                Miscellaneous:



                     jsr     r,dst

                     rts     r

                     sys     exp    (= trap)



                Flag-setting:



                     clc

                     clv

                     clz

                     cln

                     sec

                     sev

                     sez

                     sen



                Floating point ops:



                     cfcc

                     setf

                     setd

                     seti

                     setl

                     clrf     fdst

                     negf     fdst

                     absf     fdst

                     tstf     fsrc

                     movf     fsrc,fr (= ldf)

                     movf     fr,fdst (= stf)

                     movif    src,fr  (= ldcif)

                     movfi    fr,dst  (= stcfi)

                     movof    fsrc,fr (= ldcdf)

                     movfo    fr,fdst (= stcfd)

                     addf     fsrc,fr

                     subf     fsrc,fr

                     mulf     fsrc,fr

                     divf     fsrc,fr

                     cmpf     fsrc,fr

                     modf     fsrc,fr



                11/45 operations



                     als      src,r   (= ash)

                     alsc     src,r   (= ashc)

                     mpy      src,r   (= mul)

                     dvd      src,r   (= div)

                     xor      src,r

                     sxt      dst

                     mark     exp

                     sob      r,src



                Specials



                     .byte

                     .even

                     .if

                     .endif

                     .globl

                     .text

                     .data

                     .bss

                     .comm