home *** CD-ROM | disk | FTP | other *** search
Text File | 1979-01-10 | 28.9 KB | 1,010 lines |
- .\"tbl ... ^ [tn]roff -ms
- .hc %
- .TL
- Assembler Reference Manual
- .AU
- Dennis M. Ritchie
- .AI
- .MH
- .SH
- 0. Introduction
- .PP
- This document describes the usage and input syntax
- of the \s8UNIX PDP\s10-11 assembler \fIas\fP.
- The details
- of the \s8PDP\s10-11 are not described.
- .PP
- The input syntax of the \s8UNIX\s10 assembler is generally
- similar to that of the \s8DEC\s10 assembler \s8PAL\s10-11\s8R\s10, although
- its internal workings and output format
- are unrelated.
- It may be useful to read the publication \s8DEC\s10-11-\s8ASDB\s10-\s8D\s10,
- which describes \s8PAL\s10-11\s8R\s10, although naturally
- one must use care in assuming that its rules apply
- to \fIas\fP.
- .PP
- \fIAs\fP is a rather ordinary assembler without
- macro capabilities.
- It produces an output file that contains
- relocation information and a complete
- symbol table;
- thus the output is acceptable to the \s8UNIX\s10 link-editor
- \fIld\fP, which
- may be used to combine the outputs of several
- assembler runs and to obtain
- object programs from libraries.
- The output format has been designed
- so that if a program contains no unresolved
- ref%er%ences to external symbols, it is executable
- without further processing.
- .SH
- 1. Usage
- .PP
- \fIas\fP is used as follows:
- .DS
- as \fR[\fB \-u \fR] [ \fB\-o \fIoutput\fR ] \fIfile\s6\d1\u\s10 .\|.\|.
- .DE
- If the optional ``\-u'' argument is
- given, all undefined symbols
- in the current assembly will be made undefined-external.
- See the \fB.globl\fR directive below.
- .PP
- The other arguments name files
- which are concatenated and assembled.
- Thus programs may be written in several
- pieces and assembled together.
- .PP
- The output of the assembler is by default placed on
- the file \fIa.out\fR in the current directory;
- the ``\-o'' flag causes the output to be placed on the named file.
- If there were no unresolved
- external ref%er%ences, and no errors detected,
- the output file is marked executable; otherwise, if it is
- produced at all, it is made non-executable.
- .SH
- 2. Lexical conventions
- .PP
- Assembler tokens include identifiers (alternatively, ``symbols'' or ``names''),
- temporary symbols,
- constants, and operators.
- .SH
- 2.1 Identifiers
- .PP
- An identifier consists of a sequence of alphanumeric characters (including
- period ``\|\fB.\fR\|'', underscore ``\(ul'',
- and tilde ``~''
- as alphanumeric)
- of which the first may not
- be numeric.
- Only the first eight characters are significant.
- When a name begins with a tilde, the tilde is discarded
- and that occurrence of the identifier generates
- a unique entry in the symbol table which can match
- no other occurrence of the identifier.
- This feature is used
- by the C compiler to place names of local variables
- in the output symbol table
- without having to worry
- about
- making them unique.
- .SH
- 2.2 Temporary symbols
- .PP
- A temporary symbol consists of a digit followed by ``f\|'' or
- ``b''.
- Temporary symbols are discussed fully in \(sc5.1.
- .SH
- 2.3 Constants
- .PP
- An octal constant consists of a sequence of digits; ``8'' and
- ``9'' are taken to have octal value 10 and 11.
- The constant
- is truncated to 16 bits and interpreted in two's complement
- notation.
- .PP
- A decimal constant consists of a sequence of digits terminated
- by a decimal point ``\fB.\fR''. The magnitude of the constant should be
- representable in 15 bits; i.e., be less than 32,768.
- .PP
- A single-character constant consists of a single quote ``\|\(fm\|''
- followed by an \s8ASCII\s10 character not a new-line.
- Certain dual-character escape sequences
- are acceptable in place of the \s8ASCII\s10 character to represent
- new-line and other non-graphics (see \fIString state%ments\fP, \(sc5.5).
- The constant's value has the code for the
- given character in the least significant
- byte of the word and is null-padded on the left.
- .PP
- A double-character constant consists of a double
- quote ``\|"\|'' followed by a pair of \s8ASCII\s10 characters
- not including new-line.
- Certain dual-character escape sequences are acceptable
- in place of either of the \s8ASCII\s10 characters
- to represent new-line and other non-graphics
- (see \fIString state%ments\fR, \(sc5.5).
- The constant's value has the code for the first
- given character in the least significant
- byte and that for the second character in
- the most significant byte.
- .SH
- 2.4 Operators
- .PP
- There are several single- and double-character
- operators; see \(sc6.
- .SH
- 2.5 Blanks
- .PP
- Blank and tab characters
- may be interspersed freely between tokens, but may
- not be used within tokens (except character constants).
- A blank or tab is required to separate adjacent
- identifiers or constants not otherwise separated.
- .SH
- 2.6 Comments
- .PP
- The character ``\|/\|'' introduces a comment, which extends
- through the end of the line on which it appears.
- Comments are ignored by the assembler.
- .SH
- 3. Segments
- .PP
- Assembled code and data
- fall into three segments: the text segment, the data segment, and the bss segment.
- The text segment is the one in which the assembler begins,
- and it is the one into which instructions are typically placed.
- The \s8UNIX\s10 system will, if desired,
- enforce the purity of the text segment of programs by
- trapping write operations
- into it.
- Object programs produced by the assembler must be processed
- by the link-editor \fIld\fR
- (using its ``\-n'' flag)
- if the text segment is to be write-protected.
- A single copy of the text
- segment is shared among all processes
- executing such a program.
- .PP
- The data segment is available for placing
- data or instructions which
- will be modified during execution.
- Anything which may go in the text segment may be put
- into the data segment.
- In programs with write-protected, sharable text segments,
- data segment contains the initialized but variable
- parts of a program.
- If the text segment is not pure, the data segment begins
- immediately after the
- text segment;
- if the text segment is pure, the data segment begins at the lowest
- 8K byte boundary after the text segment.
- .PP
- The bss segment may not contain any explicitly initialized code
- or data.
- The length of the bss segment (like that of text or data)
- is determined by the high-water mark of the location counter
- within it.
- The bss segment is actually an extension of
- the data segment and begins immediately after it.
- At the start of execution of a program, the bss segment
- is set to 0.
- Typically the bss segment is set up
- by state%ments exemplified by
- .DS
- lab\fB: .\fR = \fB.\fR+10
- .DE
- The advantage in using the bss segment
- for storage that starts off empty is that the initialization
- information need not be stored in the output file.
- See also \fILocation counter\fP and \fIAssignment state%ments\fP
- below.
- .SH
- 4. The location counter
- .PP
- One special symbol, ``\|\fB.\fP\|'', is the location counter.
- Its value at any time is the offset
- within the appropriate segment of the start of
- the state%ment in which it appears.
- The location counter may be assigned to,
- with the restriction that the
- current segment may not change;
- furthermore,
- the value of ``\|\fB.\fP\|'' may not decrease.
- If the effect of the assignment is to increase the value of ``\|\fB.\fP\|'',
- the required number of null bytes are generated
- (but see \fISegments\fP above).
- .SH
- 5. Statements
- .PP
- A source program is composed of a sequence of
- \fIstate%ments\fP.
- Statements are separated either by new-lines
- or by semicolons.
- There are five kinds of state%ments: null state%ments,
- expression state%ments, assignment state%ments,
- string state%ments,
- and keyword state%ments.
- .PP
- Any kind of state%ment may be preceded by
- one or more labels.
- .SH
- 5.1 Labels
- .PP
- There are two kinds of label:
- name labels and numeric labels.
- A name label consists of a name followed
- by a colon (\|:\|).
- The effect of a name label is to assign the current
- value and type of the location counter ``\|\fB.\fP\|''
- to the name.
- An error is indicated in pass 1 if the
- name is already defined;
- an error is indicated in pass 2 if the ``\|\fB.\fP\|''
- value assigned changes the definition
- of the label.
- .PP
- A numeric label consists of a digit \fI0\fR to \fI9\fR followed by a colon (\|:\|).
- Such a label serves to define temporary
- symbols of the form ``\fIn\fR\|b'' and ``\fIn\fR\|f\|'', where \fIn\fR is
- the digit of the label.
- As in the case of name labels, a numeric label assigns
- the current value and type of ``\|\fB.\fP\|'' to the temporary
- symbol.
- However, several numeric labels with the same
- digit may be used within the same assembly.
- Ref%er%ences of the form ``\fIn\fR\|f\|'' refer to the first
- numeric label ``\fIn\|\fR:'' \fIf\fR\|orward from the ref%er%ence;
- ``\fIn\|\fRb'' symbols refer to the first ``\fIn\|\fR\|:'' label
- \fIb\|\fRackward from the ref%er%ence.
- This sort of temporary label was introduced by Knuth
- [\fIThe Art of Computer Programming, Vol I: Fundamental Algorithms\|\fR].
- Such labels tend to conserve both the symbol table
- space of the assembler and the
- inventive powers of the programmer.
- .SH
- 5.2 Null state%ments
- .PP
- A null state%ment is an empty state%ment (which may, however,
- have labels).
- A null state%ment is ignored by the assembler.
- Common examples of null state%ments are empty
- lines or lines containing only a label.
- .SH
- 5.3 Expression state%ments
- .PP
- An expression state%ment consists of an arithmetic
- expression not beginning with
- a keyword.
- The assembler computes its (16-bit) value
- and places it in the output stream, together with the
- appropriate relocation bits.
- .SH
- 5.4 Assignment state%ments
- .PP
- An assignment state%ment consists of an identifier, an equals sign (\|=\|),
- and an expression.
- The value and type of the expression are assigned to
- the identifier.
- It is not required that the type or value be
- the same in pass 2 as in pass 1, nor is it an
- error to redefine any symbol by assignment.
- .PP
- Any external attribute of the expression is lost across
- an assignment.
- This means that it is not possible to declare a global
- symbol by assigning to it, and that it is impossible
- to define a symbol to be offset from a non-locally
- defined global symbol.
- .PP
- As mentioned,
- it is permissible to assign to the
- location counter ``\|\fB.\fP\|''.
- It is required, however, that the type of
- the expression assigned be of the same type
- as ``\|\fB.\fP\|'',
- and it is forbidden to decrease the value
- of ``\fB\|.\|\fR''.
- In practice, the most common assignment to ``\|\fB.\fP\|'' has the form
- ``.\|=\|.\|+\|\fIn\fR''
- for some number \fIn;\fR this has the effect of generating
- \fIn\fR null bytes.
- .SH
- 5.5 String state%ments
- .PP
- A string state%ment generates a sequence of bytes containing \s8ASCII\s10 characters.
- A string state%ment consists of a left string quote ``<''
- followed by a sequence of \s8ASCII\s10 characters not including newline,
- followed by a right string quote ``>''.
- Any of the \s8ASCII\s10 characters may
- be replaced by a two-character escape sequence to represent
- certain non-graphic characters, as follows:
- .DS C
- .TS
- l l l.
- \en \s8NL\s10 (012)
- \es \s8SP\s10 (040)
- \et \s8HT\s10 (011)
- \ee \s8EOT\s10 (004)
- \e0 \s8NUL\s10 (000)
- \er \s8CR\s10 (015)
- \ea \s8ACK\s10 (006)
- \ep \s8PFX\s10 (033)
- \e\e \e
- \e> >
- .TE
- .DE
- The last two are included so that the escape character
- and the right string quote may be represented.
- The same escape sequences
- may also be used within single- and double-character
- constants (see \(sc2.3 above).
- .SH
- 5.6 Keyword state%ments
- .PP
- Keyword state%ments are numerically the most common type,
- since most machine instructions are of this
- sort.
- A keyword state%ment begins with one of the many predefined
- keywords of the assembler;
- the syntax of the remainder depends
- on the keyword.
- All the keywords are listed below with the syntax they require.
- .SH
- 6. Expressions
- .PP
- An expression is a sequence of symbols representing a value.
- Its constituents are identifiers, constants, temporary symbols,
- operators, and brackets.
- Each expression has a type.
- .PP
- All operators in expressions are fundamentally binary in
- nature; if an operand is missing on the left, a 0
- of absolute type is assumed.
- Arithmetic
- is two's complement and has 16 bits of precision.
- All operators have equal precedence, and expressions
- are evaluated
- strictly left to right except for the effect
- of brackets.
- .SH
- 6.1 Expression operators
- .PP
- The operators are:
- .IP (blank) 8
- when there is no operand between
- operands, the effect is
- exactly the same as if a ``+'' had appeared.
- .pg
- .ti 0
- .IP + 8
- addition
- .IP \- 8
- subtraction
- .IP * 8
- multiplication
- .IP \e\(sl 8
- division (note that plain ``\|/\|'' starts a comment)
- .IP 8 & 8
- bitwise \fBand\fR
- .IP \(bv 8
- bitwise \fBor\fR
- .IP \e> 8
- logical right shift
- .IP \\e< 8
- logical left shift
- .hc
- .IP % 8
- modulo
- .IP ! 8
- .hc %
- \fIa\fR\|!\|\fIb\fR is \fIa \fBor \fR(\|\fBnot \fIb\fR\|);
- i.e., the \fBor\fR of the first operand and
- the one's complement of the second; most common use is
- as a unary.
- .IP ^ 8
- result has the value of first operand and the type of the second;
- most often used to define new machine instructions
- with syntax identical to existing instructions.
- .PP
- Expressions may be grouped by use of square brackets ``\|[\|\|]\|''.
- (Round parentheses are reserved for address modes.)
- .SH
- 6.2 Types
- .PP
- The assembler deals with a number of types
- of expressions. Most types
- are attached to keywords and used to select the
- routine which treats that keyword. The types likely
- to be met explicitly are:
- .IP undefined 8
- .br
- Upon first encounter, each symbol is undefined.
- It may become undefined if it is assigned an undefined expression.
- It is an error to attempt to assemble an undefined
- expression in pass 2; in pass 1, it is not (except that
- certain keywords require operands which are not undefined).
- .IP "undefined external" 8
- .br
- A symbol which is declared \fB.globl\fR but not defined
- in the current assembly is an undefined
- external.
- If such a symbol is declared, the link editor \fIld\fR
- must be used to load the assembler's output with
- another routine that defines the undefined ref%er%ence.
- .IP absolute 8
- An absolute symbol is defined ultimately from a constant.
- Its value is unaffected by any possible future applications
- of the link-editor to the output file.
- .IP text 8
- The value of a text symbol is measured
- with respect to the beginning of the text segment of the program.
- If the assembler output is link-edited, its text
- symbols may change in value
- since the program need
- not be the first in the link editor's output.
- Most text symbols are defined by appearing as labels.
- At the start of an assembly, the value of ``\|\fB.\fP\|'' is text 0.
- .IP data 8
- The value of a data symbol is measured
- with respect to the origin of the data segment of a program.
- Like text symbols, the value of a data symbol may change
- during a subsequent link-editor run since previously
- loaded programs may have data segments.
- After the first \fB.data\fR state%ment, the value of ``\|\fB.\fP\|''
- is data 0.
- .IP bss 8
- The value of a bss symbol is measured from
- the beginning of the bss segment of a program.
- Like text and data symbols, the value of a bss symbol
- may change during a subsequent link-editor
- run, since previously loaded programs may have bss segments.
- After the first \fB.bss\fR state%ment, the value of ``\|\fB.\fP\|'' is bss 0.
- .IP "external absolute, text, data, or bss" 8
- .br
- symbols declared \fB.globl\fR
- but defined within an assembly as absolute, text, data, or bss
- symbols may be used exactly as if they were not
- declared \fB.globl\fR; however, their value and type are available
- to the link editor so that the program may be loaded with others
- that ref%er%ence these symbols.
- .IP register 8
- .br
- The symbols
- .DS
- \fBr0\fR .\|.\|. \fBr5
- fr0\fR .\|.\|. \fBfr5
- sp
- pc
- .DE
- are predefined
- as register symbols.
- Either they or symbols defined from them must
- be used to refer to the six general-purpose,
- six floating-point, and
- the 2 special-purpose machine registers.
- The behavior of the floating register names
- is identical to that of the corresponding
- general register names; the former
- are provided as a mnemonic aid.
- .IP "other types" 8
- .br
- Each keyword known to the assembler has a type which
- is used to select the routine which processes
- the associated keyword state%ment.
- The behavior of such symbols
- when not used as keywords is the same as if they were absolute.
- .SH
- 6.3 Type propagation in expressions
- .PP
- When operands are combined by expression operators,
- the result has a type which depends on the types
- of the operands and on the operator.
- The rules involved are complex to state but
- were intended to be sensible and predictable.
- For purposes of expression evaluation the
- important types are
- .DS
- undefined
- absolute
- text
- data
- bss
- undefined external
- other
- .DE
- The combination rules are then:
- If one of the operands
- is undefined, the result is undefined.
- If both operands are absolute, the result is absolute.
- If an absolute is combined with one of the ``other types''
- mentioned above,
- or with a register expression, the result
- has the register or other type.
- As a consequence,
- one can refer to r3 as ``r0+3''.
- If two operands of ``other type'' are combined,
- the result has the
- numerically larger type
- An ``other type'' combined with an explicitly
- discussed type other than absolute
- acts like an absolute.
- .PP
- Further rules applying to particular operators
- are:
- .IP +
- If one operand is text-, data-, or bss-segment
- relocatable, or is an undefined external,
- the result has the postulated type and the other operand
- must be absolute.
- .IP \-
- If the first operand is a relocatable
- text-, data-, or bss-segment symbol, the second operand
- may be absolute (in which case the result has the
- type of the first operand);
- or the second operand may have the same type
- as the first (in which case the result is absolute).
- If the first operand is external undefined, the second must be
- absolute.
- All other combinations are illegal.
- .IP ^
- This operator follows no other rule than
- that the result has the value
- of the first operand and the type of the second.
- .PP
- .IP others
- .br
- It is illegal to apply these operators to any but absolute
- symbols.
- .SH
- 7. Pseudo-operations
- .PP
- The keywords listed below introduce
- state%ments that generate data in unusual forms or
- influence the later operations of the assembler.
- The metanotation
- .DS
- [ stuff ] .\|.\|.
- .DE
- means that 0 or more instances of the given stuff may appear.
- Also, boldface tokens are literals, italic words
- are substitutable.
- .SH
- 7.1 \fB.byte \fIexpression \fR[ \fB, \fIexpression \fR] .\|.\|.
- .PP
- The \fIexpression\fRs in the comma-separated
- list are truncated to 8 bits and assembled in successive
- bytes.
- The expressions must be absolute.
- This state%ment and the string state%ment above are the only ones
- that assemble data one byte at at time.
- .SH
- 7.2 \fB.even\fR
- .PP
- If the location counter ``\|\fB.\fP\|'' is odd, it is advanced by one
- so the next state%ment will be assembled
- at a word boundary.
- .SH
- 7.3 \fB.if \fIexpression\fR
- .PP
- The \fIexpression\fR must be absolute and defined in pass 1.
- If its value is nonzero, the \fB.if\fR is ignored; if zero,
- the state%ments between the \fB.if\fR and the matching \fB.endif\fR
- (below) are ignored.
- \&\fB.if\fR may be nested.
- The effect of \fB.if\fR cannot extend beyond
- the end of the input file in which it appears.
- (The state%ments are not totally ignored, in
- the following
- sense: \fB.if\fRs and \fB.endif\fRs are scanned for, and
- moreover all names
- are entered in the symbol table.
- Thus names occurring only inside
- an \fB.if\fR
- will show up as undefined if the symbol
- table is listed.)
- .SH
- 7.4 \fB.endif\fR
- .PP
- This state%ment marks the end of a conditionally-assembled section of code.
- See \fB.if\fR above.
- .SH
- 7.5 \fB.globl \fIname \fR[ \fB,\fI name \fR] .\|.\|.
- .PP
- This state%ment makes the \fInames\fR external.
- If they are otherwise defined (by assignment or
- appearance as a label)
- they act within the assembly exactly as if
- the \fB.globl\fR state%ment were not given; however,
- the link editor \fIld\fR may be used
- to combine this routine with other routines that refer
- these symbols.
- .PP
- Conversely, if the given symbols are not defined
- within the current assembly, the link editor
- can combine the output of this assembly
- with that of others which define the symbols.
- As discussed in \(sc1, it is possible to force
- the assembler to make all otherwise
- undefined symbols external.
- .SH
- 7.6 \fB.text\fR
- .SH
- 7.7 \fB.data\fR
- .SH
- 7.8 \fB.bss\fR
- .PP
- These three pseudo-operations cause the
- assembler to begin assembling into the text, data, or
- bss segment respectively.
- Assembly starts in the text segment.
- It is forbidden to assemble any
- code or data into the bss segment, but symbols may
- be defined and ``\|\fB.\fP\|'' moved about by assignment.
- .SH
- 7.9 \fB.comm\fI name \fB, \fIexpression\fR
- .PP
- Provided the \fIname\fR is not defined elsewhere,
- this state%ment is equivalent to
- .DS
- \&.globl name
- name = expression ^ name
- .DE
- That is, the type of \fIname\fR
- is ``undefined external'', and its value is \fIexpression\fR.
- In fact the \fIname\fR behaves
- in the current assembly just like an
- undefined external.
- However, the link-editor \fIld\fR has been special-cased
- so that all external symbols which are not
- otherwise defined, and which have a non-zero
- value, are defined to lie in the bss
- segment, and enough space is left after the
- symbol to hold \fIexpression\fR
- bytes.
- All symbols which become defined in this way
- are located before all the explicitly defined
- bss-segment locations.
- .SH
- 8. Machine instructions
- .PP
- Because of the rather complicated instruction and addressing
- structure of the \s8PDP\s10-11, the syntax of machine instruction
- state%ments is varied.
- Although the following sections give the syntax
- in detail, the machine handbooks should
- be consulted on the semantics.
- .SH
- 8.1 Sources and Destinations
- .PP
- The syntax of general source and destination
- addresses is the same.
- Each must have one of the following forms,
- where \fIreg\fR is a register symbol, and \fIexpr\fR
- is any sort of expression:
- .DS C
- .TS
- c c c
- l l l.
- syntax words mode
- _
- \fIreg\fR 0 00+\fIreg\fB
- (\|\fIreg\fB\|)\|+ \fR0 20+\fIreg\fB
- \fB\-\|(\|\fIreg\fB\|) \fR0 40+\fIreg\fR
- \fIexpr\|\fB(\|\fIreg\fB\|) \fR1 60+\fIreg\fB
- (\|\fIreg\fB\|) \fR0 10+\fIreg\fB
- *\|\fIreg\fB \fR0 10+\fIreg\fB
- \fB*\|(\|\fIreg\fB\|)\|+ \fR0 30+\fIreg\fB
- \fB*\|\-\|(\|\fIreg\fB\|) \fR0 50+\fIreg\fB
- *\|(\|\fIreg\fB\|) \fR1 70+\fIreg\fB
- \fB*\|\fIexpr\fB\|(\|\fIreg\fB\|) \fR1 70+\fIreg\fB
- \fIexpr \fR1 67
- \fB$\|\fIexpr \fR1 27
- \fB*\|\fIexpr \fR1 77
- \fB*\|$\|\fIexpr \fR1 37
- .TE
- .DE
- The \fIwords\fR column gives the number of address words generated;
- the \fImode\fR column gives the octal address-mode number.
- The syntax of the address forms is
- identical to that in \s8DEC\s10 assemblers, except that ``*'' has
- been substituted for ``@''
- and ``$'' for ``#''; the \s8UNIX\s10 typing conventions make ``@'' and ``#''
- rather inconvenient.
- .PP
- Notice that mode ``*reg'' is identical to ``(reg)'';
- that ``*(reg)'' generates an index word (namely, 0);
- and that addresses consisting of an unadorned expression
- are assembled as pc-relative ref%er%ences independent
- of the type of the expression.
- To force a non-relative ref%er%ence, the form ``*$expr'' can
- be used, but notice that further indirection is impossible.
- .SH
- 8.3 Simple machine instructions
- .PP
- The following instructions
- are defined as absolute symbols:
- .KS
- .DS
- .ft B
- clc
- clv
- clz
- cln
- sec
- sev
- sez
- sen
- .DE
- .KE
- They therefore require
- no special syntax.
- The \s8PDP\s10-11 hardware allows more than one of the ``clear''
- class, or alternatively more than one of the ``set'' class
- to be \fBor\fR-ed together; this may be expressed as follows:
- .DS
- clc\|\|\|\(bv\|\|clv
- .DE
- .SH
- 8.4 Branch
- .PP
- The following instructions take an expression as operand.
- The expression must lie in the same segment as the ref%er%ence,
- cannot be undefined-external,
- and its value cannot differ from the current location of ``\|\fB.\fP\|''
- by more than 254 bytes:
- .KS
- .DS
- .ft B
- .ta 1.5i 2.5i
- br blos
- bne bvc
- beq bvs
- bge bhis
- blt bec \fR(=\fB bcc\fR)\fB
- bgt bcc
- ble blo
- bpl bcs
- bmi bes \fR(=\fB bcs\fR)\fB
- bhi
- .DE
- .KE
- \fBbes\fR (``branch on error set'')
- and \fBbec\fR (``branch on error clear'')
- are intended to test the error bit
- returned by system calls (which
- is the c-bit).
- .SH
- 8.5 Extended branch instructions
- .PP
- The following symbols are followed by an expression
- representing an address
- in the same segment as ``\|\fB.\|\fP''.
- If the target address is close enough,
- a branch-type instruction is generated;
- if the address is too far away,
- a \fBjmp\fR will be used.
- .pg
- .KS
- .DS
- .ft B
- .ta 1.5i
- jbr jlos
- jne jvc
- jeq jvs
- jge jhis
- jlt jec
- jgt jcc
- jle jlo
- jpl jcs
- jmi jes
- jhi
- .DE
- .KE
- \fBjbr\fR turns into a plain \fBjmp\fR
- if its target is too remote;
- the others (whose names are contructed
- by replacing the ``b'' in the branch instruction's
- name by ``j''\|)
- turn into the converse branch over a \fBjmp\fR
- to the target address.
- .SH
- 8.6 Single operand instructions
- .PP
- The following
- symbols are names of single-operand
- machine instructions.
- The form
- of address expected is discussed in \(sc8.1 above.
- .KS
- .DS
- .ta 1.5i
- clr sbcb
- clrb ror
- com rorb
- comb rol
- inc rolb
- incb asr
- dec asrb
- decb asl
- neg aslb
- negb jmp
- adc swab
- adcb tst
- sbc tstb
- .DE
- .KE
- .SH
- 8.7 Double operand instructions
- .PP
- The following instructions take a general source
- and destination (\(sc8.1), separated by a comma, as operands.
- .KS
- .DS
- .ft B
- .ta 1.5i
- mov
- movb
- cmp
- cmpb
- bit
- bitb
- bic
- bicb
- bis
- bisb
- add
- sub
- .DE
- .KE
- .SH
- 8.8 Miscellaneous instructions
- .PP
- The following instructions have
- more specialized syntax.
- Here \fIreg\fR is
- a register name, \fIsrc\fR and \fIdst\fR a general source
- or destination
- (\(sc8.1), and \fIexpr\fR is an expression:
- .KS
- .DS
- .ta .5i 2i
- \fBjsr\fI reg,dst
- \fBrts\fI reg
- \fBsys\fI expr
- \fBash \fIsrc\|,\|reg \fR(or, \fBals\fR)\fB
- \fBashc \fIsrc\|,\|reg \fR(or, \fBalsc\fR)\fB
- \fBmul \fIsrc\|,\|reg \fR(or, \fBmpy\fR)\fB
- \fBdiv \fIsrc\|,\|reg \fR(or, \fBdvd\fR)\fR
- \fBxor \fIreg\|,\|dst\fB
- \fBsxt \fIdst\fB
- \fBmark \fIexpr\fB
- \fBsob \fIreg\|,\|expr\fB
- .DE
- .KE
- \fBsys\fR is another name for the \fBtrap\fR instruction.
- It is used to code system calls.
- Its operand is required to be expressible in 6 bits.
- The expression in \fBmark\fR must be expressible
- in six bits, and the expression in \fBsob\fR must
- be in the same segment as ``\fB\|.\|\fR'',
- must not be external-undefined, must be less than ``\|\fB.\fR\|'',
- and must be within 510 bytes of ``\|\fB.\fR\|''.
- .SH
- 8.9 Floating-point unit instructions
- .PP
- The following floating-point operations are defined,
- with syntax as indicated:
- .KS
- .DS
- .ta .5i 2i
- \fBcfcc
- \fBsetf
- \fBsetd
- \fBseti
- \fBsetl
- \fBclrf \fIfdst
- \fBnegf \fIfdst
- \fBabsf \fIfdst
- \fBtstf \fIfsrc
- \fBmovf \fIfsrc,\|freg \fR(= ldf\fR\|)
- \fBmovf \fIfreg,\|fdst \fR(= stf\fR\|)
- \fBmovif \fIsrc,\|freg \fR(= ldcif\fR\|)
- \fBmovfi \fIfreg,\|dst \fR(= stcfi\fR\|)
- \fBmovof \fIfsrc,\|freg \fR(= ldcdf\fR\|)
- \fBmovfo \fIfreg,\|fdst \fR(= stcfd\fR\|)
- \fBmovie \fIsrc,\|freg \fR(= ldexp\fR)
- \fBmovei \fIfreg,\|dst \fR(= stexp\fR)
- \fBaddf \fIfsrc,\|freg
- \fBsubf \fIfsrc,\|freg
- \fBmulf \fIfsrc,\|freg
- \fBdivf \fIfsrc,\|freg
- \fBcmpf \fIfsrc,\|freg
- \fBmodf \fIfsrc,\|freg
- \fBldfps \fIsrc
- \fBstfps \fIdst
- \fBstst \fIdst\fR
- .DE
- .KE
- \fIfsrc\fR, \fIfdst\fR, and \fIfreg\fR mean floating-point
- source, destination, and register respectively.
- Their syntax is identical to that for
- their non-floating counterparts, but
- note that only
- floating registers 0-3 can be a \fIfreg\fR.
- .PP
- The names of several of the operations
- have been changed to bring out an analogy with
- certain fixed-point instructions.
- The only strange case is \fBmovf\fR, which turns into
- either \fBstf\fR or \fBldf\fR
- depending respectively on whether its first operand is
- or is not a register.
- Warning: \fBldf\fR sets the floating condition codes,
- \fBstf\fR does not.
- .SH
- 9. Other symbols
- .SH
- 9.1 \fB.\|.\fR
- .PP
- The symbol ``\fB\|.\|.\|\fR''
- is the
- \fIrelocation counter\fR.
- Just before each assembled word is placed in the output stream,
- the current value of this symbol is added to the word
- if the word refers to a text, data or bss segment location.
- If the output word is a pc-relative address word
- that refers to an absolute location,
- the value of ``\fB\|.\|.\|\fR'' is subtracted.
- .PP
- Thus the value of ``\fB\|.\|.\|\fR'' can be taken to mean
- the starting memory location of the program.
- The initial value of ``\|\fB.\|.\fR\|'' is 0.
- .PP
- The value of ``\|\fB.\|.\fR\|'' may be changed by assignment.
- Such a course of action is sometimes
- necessary, but the consequences
- should be carefully thought out.
- It is particularly ticklish
- to change ``\|\fB.\|.\fR\|'' midway in an assembly
- or to do so in a program which will
- be treated by the loader, which has
- its own notions of ``\|\fB.\|.\fR\|''.
- .SH
- 9.2 System calls
- .PP
- System call names are not predefined.
- They may be found in the file
- .I /usr/include/sys.s
- .SH
- 10. Diagnostics
- .PP
- When
- an input file cannot be read, its name
- followed by a question mark is typed and assembly
- ceases.
- When syntactic or semantic errors occur, a single-character diagnostic is typed out
- together with the line number and the file name in which it
- occurred. Errors in pass 1 cause cancellation of pass 2.
- The possible errors are:
- .KS
- .DS
- .ta .3i
- ) parentheses error
- ] parentheses error
- > string not terminated properly
- * indirection (\|*\|) used illegally
- \&\fB.\fR illegal assignment to ``\|\fB.\fR\|''
- \s8A\s10 error in address
- \s8B\s10 branch address is odd or too remote
- \s8E\s10 error in expression
- \s8F\s10 error in local (``f\|'' or ``b'') type symbol
- \s8G\s10 garbage (unknown) character
- \s8I\s10 end of file inside an \fB.if\fR
- \s8M\s10 multiply defined symbol as label
- \s8O\s10 word quantity assembled at odd address
- \s8P\s10 phase error\(em ``\|\fB.\fP\|'' different in pass 1 and 2
- \s8R\s10 relocation error
- \s8U\s10 undefined symbol
- \s8X\s10 syntax error
- .DE
- .KE
-