|
|
1.1 root 1: .\"
2: .\" Copyright (c) 1982 Regents of the University of California
3: .\" @(#)asdocs4.me 1.9 7/1/83
4: .\"
5: .EQ
6: delim $$
7: .EN
8: .SH 1 "Machine instructions"
9: .pp
10: The syntax of machine instruction statements accepted by
11: .i as
12: is generally similar to the syntax of \*(DM.
13: There are differences,
14: however.
15: .SH 2 "Character set"
16: .pp
17: .i As
18: uses the character
19: .q \*(DL
20: instead of
21: .q #
22: for immediate constants,
23: and the character
24: .q *
25: instead of
26: .q @
27: for indirection.
28: Opcodes and register names
29: are spelled with lower-case rather than upper-case letters.
30: .SH 2 "Specifying Displacement Lengths"
31: .pp
32: Under certain circumstances,
33: the following constructs are (optionally) recognized by
34: .i as
35: to indicate the number of bytes to allocate for
36: the displacement used when constructing
37: displacement and displacement deferred addressing modes:
38: .(b
39: .TS
40: center;
41: c c l
42: cb cb l.
43: primary alternate length
44: _
45: B\` B^ byte (1 byte)
46: W\` W^ word (2 bytes)
47: L\` L^ long word (4 bytes)
48: .TE
49: .)b
50: .pp
51: One can also use lower case
52: .b b ,
53: .b w
54: or
55: .b l
56: instead of the upper
57: case letters.
58: There must be no space between the size specifier letter and the
59: .q "^"
60: or
61: .q "\`" .
62: The constructs
63: .b "S^"
64: and
65: .b "G^"
66: are not recognized
67: by
68: .i as ,
69: as they are by the \*(DM assembler.
70: It is preferred to use the
71: .q "\`" displacement specifier,
72: so that the
73: .q "^"
74: is not
75: misinterpreted as the
76: .b xor
77: operator.
78: .pp
79: Literal values
80: (including floating-point literals used where the
81: hardware expects a floating-point operand)
82: are assembled as short
83: literals if possible,
84: hence not needing the
85: .b "S^"
86: \*(DM directive.
87: .pp
88: If the displacement length modifier is present,
89: then the displacement is
90: .b always
91: assembled with that displacement,
92: even if it will fit into a smaller field,
93: or if significance is lost.
94: If the length modifier is not present,
95: and if the value of the displacement is known exactly in
96: .i as 's
97: first pass,
98: then
99: .i as
100: determines the length automatically,
101: assembling it in the shortest possible way,
102: Otherwise,
103: .i as
104: will use the value specified by the
105: .b \-d
106: argument,
107: which defaults to 4 bytes.
108: .SH 2 "case\fIx\fP Instructions"
109: .pp
110: .i As
111: considers the instructions
112: .b caseb ,
113: .b casel ,
114: .b casew
115: to have three operands.
116: The displacements must be explicitly computed by
117: .i as ,
118: using one or more
119: .b .word
120: statements.
121: .SH 2 "Extended branch instructions"
122: .pp
123: These opcodes (formed in general
124: by substituting a
125: .q j
126: for the initial
127: .q b
128: of the standard opcodes)
129: take as branch destinations
130: the name of a label in the current subsegment.
131: It is an error if the destination is known to be in a different subsegment,
132: and it is a warning if the destination is not defined within
133: the object module being assembled.
134: .pp
135: If the branch destination is close enough,
136: then the corresponding
137: short branch
138: .q b
139: instruction is assembled.
140: Otherwise the assembler choses a sequence
141: of one or more instructions which together have the same effect as if the
142: .q b
143: instruction had a larger span.
144: In general,
145: .i as
146: chooses the inverse branch followed by a
147: .b brw ,
148: but a
149: .b brw
150: is sometimes pooled among several
151: .q j
152: instructions with the same destination.
153: .pp
154: .i As
155: is unable to perform the same long/short branch generation
156: for other instructions with a fixed byte displacement,
157: such as the
158: .b sob ,
159: .b aob
160: families,
161: or for the
162: .b acbx
163: family of instructions which has a fixed word displacement.
164: This would be desirable,
165: but is prohibitive because of the complexity of these instructions.
166: .pp
167: If the
168: .b \-J
169: assembler option is given,
170: a
171: .b jmp
172: instruction is used instead of a
173: .b brw
174: instruction
175: for
176: .b ALL
177: .q j
178: instructions with distant destinations.
179: This makes assembly of large (>32K bytes)
180: programs (inefficiently)
181: possible.
182: .i As
183: does not try to use clever combinations of
184: .b brb ,
185: .b brw
186: and
187: .b jmp
188: instructions.
189: The
190: .b jmp
191: instructions use PC relative addressing,
192: with the length of the offset given by the
193: .b \-d
194: assembler
195: option.
196: .pp
197: These are the extended branch instructions
198: .i as
199: recognizes:
200: .(b
201: .TS
202: center;
203: lb lb lb.
204: jeql jeqlu jneq jnequ
205: jgeq jgequ jgtr jgtru
206: jleq jlequ jlss jlssu
207: jbcc jbsc jbcs jbss
208:
209: jlbc jlbs
210: jcc jcs
211: jvc jvs
212: jbc jbs
213: jbr
214: .TE
215: .)b
216: .pp
217: Note that
218: .b jbr
219: turns into
220: .b brb
221: if its target is close enough;
222: otherwise a
223: .b brw
224: is used.
225: .SH 1 "Diagnostics"
226: .pp
227: Diagnostics are intended to be self explanatory and appear on
228: the standard output.
229: Diagnostics either report an
230: .i error
231: or a
232: .i warning.
233: Error diagnostics complain about lexical, syntactic and some
234: semantic errors, and abort the assembly.
235: .pp
236: The majority of the warnings complain about the use of \*(VX
237: features not supported by all implementations of the architecture.
238: .i As
239: will warn if new opcodes are used,
240: if
241: .q G
242: or
243: .q H
244: floating point numbers are used
245: and will complain about mixed floating conversions.
246: .SH 1 "Limits"
247: .(b
248: .TS
249: center;
250: l l.
251: limit what
252: _
253: Arbitrary\** Files to assemble
254: BUFSIZ Significant characters per name
255: Arbitrary Characters per input line
256: Arbitrary Characters per string
257: Arbitrary Symbols
258: 4 Text segments
259: 4 Data segments
260: .TE
261: .)b
262: .(f
263: \**Although the number of characters available to the \fIargv\fP line
264: is restricted by \*(UX to 10240.
265: .)f
266: .SH 1 "Annoyances and Future Work"
267: .pp
268: Most of the annoyances deal with restrictions on the extended
269: branch instructions.
270: .pp
271: .i As
272: only uses a two level algorithm for resolving extended branch
273: instructions into short or long displacements.
274: What is really needed is a general mechanism
275: to turn a short conditional jump into a
276: reverse conditional jump over one of
277: .b two
278: possible unconditional branches,
279: either a
280: .b brw
281: or a
282: .b jmp
283: instruction.
284: Currently, the
285: .b \-J
286: forces the
287: .b jmp
288: instruction to
289: .i always
290: be used,
291: instead of the
292: shorter
293: .b brw
294: instruction when needed.
295: .pp
296: The assembler should also recognize extended branch instructions for
297: .b sob ,
298: .b aob ,
299: and
300: .b acbx
301: instructions.
302: .b Sob
303: instructions will be easy,
304: .b aob
305: will be harder because the synthesized instruction
306: uses the index operand twice,
307: so one must be careful of side effects,
308: and the
309: .b acbx
310: family will be much harder (in the general case)
311: because the comparison depends on the sign of the addend operand,
312: and two operands are used more than once.
313: Augmenting
314: .i as
315: with these extended loop instructions
316: will allow the peephole optimizer to produce much better
317: loop optimizations,
318: since it currently assumes the worst
319: case about the size of the loop body.
320: .pp
321: The string temporary file is not put in memory when the -V flag is set.
322: The string table in the generated a.out contains some strings
323: and names that are never referenced from the symbol table;
324: the loader removes these unreferenced strings, however.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.