262 lines
		
	
	
	
		
			8.3 KiB
		
	
	
	
		
			Groff
		
	
	
	
	
	
			
		
		
	
	
			262 lines
		
	
	
	
		
			8.3 KiB
		
	
	
	
		
			Groff
		
	
	
	
	
	
.\" $Header$
 | 
						|
.TH UNI_ASS 6ACK
 | 
						|
.ad
 | 
						|
.SH NAME
 | 
						|
uni_ass \- universal assembler, assembler\-loader
 | 
						|
.SH SYNOPSIS
 | 
						|
~em/lib/\fImach\fP/as [options] argument ...
 | 
						|
.SH DESCRIPTION
 | 
						|
The universal assembler is a framework allowing easy
 | 
						|
generation of an assembler for any byte oriented machine.
 | 
						|
The framework includes common pseudo instructions for name
 | 
						|
definition, label usage, storage allocation and initialization
 | 
						|
and expression evaluation.
 | 
						|
The resulting program assembles assembly modules.
 | 
						|
For some machines, it also does the link-editing (loading).
 | 
						|
Arguments may be flags, assembly language modules, or,
 | 
						|
in the case of an assembler\-loader, 
 | 
						|
.IR arch (1)
 | 
						|
libraries.
 | 
						|
.br
 | 
						|
Flags are:
 | 
						|
.IP \-d\fIonum\fP
 | 
						|
This option controls the listing.  Default is no listing.
 | 
						|
.I Onum
 | 
						|
is interpreted as an octal number.
 | 
						|
Each bit controls part of the listing as follows:
 | 
						|
.RS
 | 
						|
.nf
 | 
						|
0001: addresses in pass 1
 | 
						|
0002: generated code in pass 1
 | 
						|
0004: not used
 | 
						|
0010: addresses in pass 2
 | 
						|
0020: generated code in pass 2
 | 
						|
0040: source lines in pass 2
 | 
						|
0100: addresses in pass 3
 | 
						|
0200: generated code in pass 3
 | 
						|
0400: source lines in pass 3
 | 
						|
1000: force .list and ignore .nolist
 | 
						|
.fi
 | 
						|
.RE
 | 
						|
Thus bits in 0 to 8 control the listing format and
 | 
						|
bit 9 forces a complete listing.
 | 
						|
If
 | 
						|
.I onum
 | 
						|
is omitted or is 000 it is interpreted as 0700.
 | 
						|
If
 | 
						|
.I onum
 | 
						|
is 1000 it is interpreted as 1700.
 | 
						|
.br
 | 
						|
Note that '-d' alone (unless it contains bit 9)
 | 
						|
is not enough to get a listing.
 | 
						|
A .list pseudo is also needed in each module to be listed.
 | 
						|
Assemblers may be compiled with the listing facilities disabled.
 | 
						|
.IP -s[\fIonum\fP]
 | 
						|
This option controls the
 | 
						|
amount of symbolic debug information generated.
 | 
						|
.I Onum
 | 
						|
is interpreted as an octal number.
 | 
						|
The bits have the following meaning:
 | 
						|
.RS
 | 
						|
.nf
 | 
						|
001: external symbols
 | 
						|
002: local symbols
 | 
						|
004: local, compiler generated labels
 | 
						|
010: symbols defined in
 | 
						|
.I .symb
 | 
						|
pseudo instruction
 | 
						|
020: records for
 | 
						|
.I .line
 | 
						|
and
 | 
						|
.I .file
 | 
						|
statements
 | 
						|
040: section names
 | 
						|
.fi
 | 
						|
.RE
 | 
						|
Default is 073: all except local compiler labels.
 | 
						|
.IP -r
 | 
						|
Generate relocation information, for assemblers\-loaders that can.
 | 
						|
Assemblers always produce relocation information.
 | 
						|
.IP -b
 | 
						|
Turn off branch optimization.
 | 
						|
.IP -o\fIname\fP
 | 
						|
.IP -"o \fIname\fP"
 | 
						|
.I name
 | 
						|
is taken as the name of the
 | 
						|
resulting load file.
 | 
						|
The default name is \fBa.out\fP.
 | 
						|
.PP
 | 
						|
The assembler\-loaders assemble
 | 
						|
and link together assembly language modules
 | 
						|
machine
 | 
						|
from files and libraries,
 | 
						|
producing an \fIack.out\fP(5) format file, without relocation information.
 | 
						|
The assemblers produce a relocatable \fIack.out\fP(5) format file.
 | 
						|
.PP
 | 
						|
Two different types of arguments are allowed:
 | 
						|
.IP "1-"
 | 
						|
Assembly language modules
 | 
						|
.PD 0
 | 
						|
.IP "2-"
 | 
						|
UNIX archives, as maintained by arch(1). These archives must
 | 
						|
only contain
 | 
						|
assembly language modules with \fI.define\fP as their first
 | 
						|
statement.
 | 
						|
These are only accepted by assembler\-loaders.
 | 
						|
.PD
 | 
						|
.PP
 | 
						|
Note that assembler\-loaders cannot do a partial load;
 | 
						|
loading starts from assembly language and produces binary
 | 
						|
machine code. No relocation bits are produced.
 | 
						|
On the other hand, assemblers produce a relocatable file, to be handled
 | 
						|
by \fIled\fP(1).
 | 
						|
.SH "SECTIONS and TYPES"
 | 
						|
The statements allocating and initializing space,
 | 
						|
like instructions and
 | 
						|
some pseudo-instruction reserve that space in the current
 | 
						|
section.
 | 
						|
The currently reigning type of section is determined by
 | 
						|
the pseudo-instruction \fI.sect\fP.
 | 
						|
Actually, the assembler knows nothing about section types. Sections have
 | 
						|
numbers. The first section met gets number 0, the second gets number 1, etc.
 | 
						|
Therefore, every assembly files should start with a line just mentioning the
 | 
						|
sections used in the right order, so that no confusion can arise for \fIled\fP(1).
 | 
						|
.SH SYNTAX
 | 
						|
.PP
 | 
						|
The syntax of expressions is identical to the C expression syntax,
 | 
						|
except that square brackets are used for grouping.
 | 
						|
Labels are followed by a colon, and are identifiers or
 | 
						|
numbers between 0 and 9.
 | 
						|
Numeric labels can be referenced using the label followed by 'b' of 'f'
 | 
						|
determining the direction of search, backwards or forwards.
 | 
						|
.IP letters
 | 
						|
Both upper and lower case may be used and are seen as
 | 
						|
different.
 | 
						|
The underscore '_' is considered to be a letter.
 | 
						|
.IP identifiers
 | 
						|
Identifiers are a sequence of letters and digits, starting with
 | 
						|
a letter or a period '.'.
 | 
						|
Identifiers can, only once, receive a value through assignment or a
 | 
						|
label definition.
 | 
						|
.IP strings
 | 
						|
Strings are enclosed in single "'" or double """ quotes.
 | 
						|
The use of \eddd where ddd is an octal number and \en, \er,
 | 
						|
\et, \eb and \ef is allowed and has the same meaning as in the
 | 
						|
C language.
 | 
						|
.IP numbers
 | 
						|
Numbers are a sequence of letters and digits, starting with a
 | 
						|
digit.
 | 
						|
No difference is made between small and capital letters.
 | 
						|
.br
 | 
						|
The base of the number is determined in the following way:
 | 
						|
.nf
 | 
						|
if the number starts with '0x' it is hexadecimal else
 | 
						|
    if the number starts with '0' it is octal else
 | 
						|
        it's decimal.
 | 
						|
.fi
 | 
						|
The range of numbers depends on the machine.
 | 
						|
A rule of the thumb is that the width of the machine's registers
 | 
						|
the same is as the number of bits allowed in numbers.
 | 
						|
.IP comment
 | 
						|
The character '!' denotes the start of comment, every character
 | 
						|
up to the next newline is skipped.
 | 
						|
Exclamation marks in strings are not recognized as the start of
 | 
						|
comment.
 | 
						|
.IP statements
 | 
						|
Statements are separated by newlines and ';' and can be
 | 
						|
preceded by label definitions.
 | 
						|
Label definitions have the form "\fIidentifier\fP:" or
 | 
						|
"\fIdigit\fP:".
 | 
						|
Statements can be: empty, an assignment, an instruction or a
 | 
						|
pseudo-instruction.
 | 
						|
.IP assignment
 | 
						|
An assignment has the form:
 | 
						|
.br
 | 
						|
        \fIidentifier\fP = \fIexpression\fP
 | 
						|
.br
 | 
						|
The identifier receives the value and type of the expression.
 | 
						|
.IP instruction
 | 
						|
The syntax of an instruction depends on the type of the target
 | 
						|
machine.
 | 
						|
.IP pseudo-instruction
 | 
						|
.de Pu
 | 
						|
.sp 1
 | 
						|
.ti +5
 | 
						|
\&\\$1
 | 
						|
.sp 1
 | 
						|
..
 | 
						|
.Pu ".extern \fIidentifier [, identifier]*\fP"
 | 
						|
The identifiers mentioned in the list are exported and can be
 | 
						|
used in other modules.
 | 
						|
.Pu ".define \fIidentifier [, identifier]*\fP"
 | 
						|
Used for modules that are to be part of a libary.
 | 
						|
The .define pseudo's should be the first in such modules.
 | 
						|
When scanning a module in a library the assembler\-loader
 | 
						|
checks whether any of its unsatified external references is
 | 
						|
mentioned in a .define list. If so, it includes that module in
 | 
						|
the program.
 | 
						|
The identifiers mentioned in the list are exported and can be
 | 
						|
used in other modules.
 | 
						|
.Pu ".data1 \fIexpression [, expression]*\fP"
 | 
						|
Initialize a sequence of bytes.
 | 
						|
This is not followed by automatic alignment.
 | 
						|
.Pu ".data2 \fIexpression [, expression]*\fP"
 | 
						|
Initialize a sequence of shorts (2-byte values).
 | 
						|
This is not followed by automatic alignment.
 | 
						|
.Pu ".data4 \fIexpression [, expression]*\fP"
 | 
						|
Initialize a sequence of longs (4-byte values).
 | 
						|
This is not followed by automatic alignment.
 | 
						|
.Pu ".ascii \fIstring\fP"
 | 
						|
Initialize a sequence of bytes with the value of the bytes in
 | 
						|
the string.
 | 
						|
This is not followed by automatic alignment.
 | 
						|
.Pu ".asciz \fIstring\fP"
 | 
						|
Initialize a sequence of bytes with the value of the bytes in
 | 
						|
the string and terminate this with an extra zero byte.
 | 
						|
This is not followed by automatic alignment.
 | 
						|
.Pu ".align [\fIexpression\fP]"
 | 
						|
Adjust the current position to a multiple of the value of the
 | 
						|
expression.
 | 
						|
The default is the word-size of the target machine.
 | 
						|
.Pu ".space \fIexpression\fP"
 | 
						|
Allocate the indicated amount of bytes.
 | 
						|
The expression must be absolute.
 | 
						|
.Pu ".comm \fIname\fP,\fIexpression\fP"
 | 
						|
Allocate the indicated amount of bytes and assign the location of the first
 | 
						|
byte allocated to
 | 
						|
.IR name ,
 | 
						|
unless
 | 
						|
.I name 
 | 
						|
is defined elsewhere.
 | 
						|
If the scope of
 | 
						|
.I name
 | 
						|
is extern, then assemblers leave definition of
 | 
						|
.I name 
 | 
						|
to the linkeditor \fIled\fP(1).
 | 
						|
.Pu .sect \fIname\fP
 | 
						|
section name definition.
 | 
						|
.Pu ".base \fIexpresssion\fP"
 | 
						|
Set the starting address of the first of the consecutive segments 
 | 
						|
(text) to the value of the expression.
 | 
						|
The expression must be absolute.
 | 
						|
.Pu .assert \fIexpression\fP
 | 
						|
assembly-time assertion checking. Stop with a fatal error message when
 | 
						|
the value of the expression is zero.
 | 
						|
.Pu .symb, .line, .file
 | 
						|
symbolic debug
 | 
						|
.Pu .nolist, .list
 | 
						|
.br
 | 
						|
listing control
 | 
						|
.SH "SEE ALSO"
 | 
						|
ack(1), arch(1), ack.out(5)
 | 
						|
.SH DIAGNOSTICS
 | 
						|
Various diagnostics may be produced.
 | 
						|
The most likely errors, however, are unresolved references,
 | 
						|
probably caused by the omission of a library argument.
 | 
						|
.SH BUGS
 | 
						|
The alignment might give rise to internal assertion errors when
 | 
						|
the alignment requestes is larger than the machine dependent
 | 
						|
segment alignment.
 | 
						|
.br
 | 
						|
Identifiers declared as externals cannot be used as locals in
 | 
						|
any following module. This only is a problem for assembler\-loaders.
 |