xref: /original-bsd/old/as.vax/PSD.doc/asdocs2.me (revision 0a83ae40)

Copyright (c) 1982 Regents of the University of California
@(#)asdocs2.me 1.6 02/11/83

delim $$ .EN
1 "Statements"
.pp A source program is composed of a sequence of .i statements . Statements are separated either by new-lines or by semicolons. There are two kinds of statements: null statements and keyword statements. Either kind of statement may be preceded by one or more labels.
2 "Named Global Labels"
.pp A global 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 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 value assigned changes the definition of the label. .pp A global label is referenced by its name. .pp Global labels beginning with a .q "\|L\|" are discarded unless the .b -L option is in effect.
2 "Numeric Local Labels"
.pp A numeric label consists of a digit $0$ to $9$ followed by a colon. Such a label serves to define temporary symbols of the form .q "$n roman b$" and .q "$n roman f$" , where $n$ is the digit of the label. As in the case of name labels, a numeric label assigns the current value and type of the location counter to the temporary symbol. However, several numeric labels with the same digit may be used within the same assembly. References to symbols of the form .q "$n roman b$" refer to the first numeric label .q "$n$:" .i b ackwards from the reference; .q "$n roman f$" symbols refer to the first numeric label .q "$n$:" .i f orwards from the reference. Such numeric labels conserve the inventive powers of the human programmer. .pp For various reasons, .i as turns local labels into labels of the form $roman L n roman ".\*(DL" m$. Although unlikely, these generated labels may conflict with programmer defined labels.
2 "Null statements"
.pp A null statement is an empty statement ignored by the assembler. A null statement may be labeled, however.
2 "Keyword statements"
.pp A keyword statement begins with one of the many predefined keywords known to .i as ; the syntax of the remainder of the statement depends on the keyword. All instruction opcodes are keywords. The remaining keywords are assembler pseudo-operations, also called .i directives . The pseudo-operations are listed in \(sc8, together with the syntax they require.
1 "Expressions"
.pp An expression is a sequence of symbols representing a value. Its constituents are identifiers, constants, operators, and parentheses. Each expression has a type. .pp All operators in expressions are fundamentally binary in nature. Arithmetic is two's complement and has 32 bits of precision. .i As can not do arithmetic on floating point numbers, quad or octal precision scalar numbers. There are four levels of precedence, listed here from lowest precedence level to highest: .(b
precedence operators
binary $+$, $-$
binary \(bv\|, $&$, $italic "^"$, $!$
binary $*$, $/$, $%$,
unary $-$, $italic "~"$
.)b .pp All operators of the same precedence are evaluated strictly left to right, except for the evaluation order enforced by parenthesis.
2 "Expression Operators"
.pp The operators are: .(b
operator meaning
$+$ addition
$-$ (binary) subtraction
$*$ multiplication
$/$ division
$%$ modulo
$-$ (unary) 2's complement
$&$ bitwise and
$\(bv$ bitwise or
$italic "^"$ bitwise exclusive or
$!$ bitwise or not
$italic "~"$ bitwise 1's complement
$>$ logical right shift
$>>$ logical right shift
$<$ logical left shift
$<<$ logical left shift
.)b .pp Expressions may be grouped by use of parentheses, .q "(" and .q ")".
2 "Data Types"
.pp The assembler manipulates several different types of expressions. The types likely to be met explicitly are: .nr ii \w'undefined 'u .ip "undefined" 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" A symbol which is declared .b .globl but not defined in the current assembly is an undefined external. If such a symbol is declared, the link editor .i ld must be used to load the assembler's output with another routine that defines the undefined reference. .ip "absolute" 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" 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 .q "\|.\|" is .q "text 0" . .ip "data" 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 .b .data statement, the value of .q "\|.\|" is .q "data 0". .ip "bss" 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. .ip "external absolute, text, data, or bss" Symbols declared .b .globl but defined within an assembly as absolute, text, data, or bss symbols may be used exactly as if they were not declared .b .globl ; however, their value and type are available to the link editor so that the program may be loaded with others that reference these symbols. .ip "register" The symbols .(q .b "r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15" .b "ap fp sp pc" .)q are predefined as register symbols. In addition, the .q "%" operator converts the following absolute expression whose value is between 0 and 15 into a register reference. .ip "other types " Each keyword known to the assembler has a type which is used to select the routine which processes the associated keyword statement. The behavior of such symbols when not used as keywords is the same as if they were absolute.
2 "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 .(b
undefined
absolute
text
data
bss
undefined external
other
.)b .pp The combination rules are then .nr ii 5n .np If one of the operands is undefined, the result is undefined. .np If both operands are absolute, the result is absolute. .np If an absolute is combined with one of the .q "other types" mentioned above, the result has the other type. An .q "other type" combined with an explicitly discussed type other than absolute it 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 others It is illegal to apply these operators to any but absolute symbols.