|
|
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.