|
|
1.1 ! root 1: .\" ! 2: .\" Copyright (c) 1982 Regents of the University of California ! 3: .\" @(#)asdocs2.me 1.6 2/11/83 ! 4: .\" ! 5: .EQ ! 6: delim $$ ! 7: .EN ! 8: .SH 1 "Statements" ! 9: .pp ! 10: A source program is composed of a sequence of ! 11: .i statements . ! 12: Statements are separated either by new-lines ! 13: or by semicolons. ! 14: There are two kinds of statements: null statements ! 15: and keyword statements. ! 16: Either kind of statement may be preceded by ! 17: one or more labels. ! 18: .SH 2 "Named Global Labels" ! 19: .pp ! 20: A global label consists of a name followed ! 21: by a colon. ! 22: The effect of a name label is to assign the current ! 23: value and type of the location counter ! 24: to the name. ! 25: An error is indicated in pass 1 if the ! 26: name is already defined; ! 27: an error is indicated in pass 2 if the ! 28: value assigned changes the definition ! 29: of the label. ! 30: .pp ! 31: A global label is referenced by its name. ! 32: .pp ! 33: Global labels beginning with a ! 34: .q "\|L\|" ! 35: are discarded unless the ! 36: .b \-L ! 37: option ! 38: is in effect. ! 39: .SH 2 "Numeric Local Labels" ! 40: .pp ! 41: A numeric label consists of a digit $0$ to $9$ ! 42: followed by a colon. ! 43: Such a label serves to define temporary symbols of the form ! 44: .q "$n roman b$" ! 45: and ! 46: .q "$n roman f$" , ! 47: where $n$ ! 48: is the digit of the label. ! 49: As in the case of name labels, ! 50: a numeric label assigns ! 51: the current value and type of the location counter ! 52: to the temporary symbol. ! 53: However, several numeric labels with the same digit ! 54: may be used within the same assembly. ! 55: References to symbols of the form ! 56: .q "$n roman b$" ! 57: refer to the first numeric label ! 58: .q "$n$:" ! 59: .i b ackwards ! 60: from the reference; ! 61: .q "$n roman f$" ! 62: symbols refer to the first numeric label ! 63: .q "$n$:" ! 64: .i f orwards ! 65: from the reference. ! 66: Such numeric labels conserve the inventive powers ! 67: of the human programmer. ! 68: .pp ! 69: For various reasons, ! 70: .i as ! 71: turns local labels into labels of the form ! 72: $roman L n roman ".\*(DL" m$. ! 73: Although unlikely, ! 74: these generated labels may conflict ! 75: with programmer defined labels. ! 76: .SH 2 "Null statements" ! 77: .pp ! 78: A null statement is an empty statement ignored by the assembler. ! 79: A null statement may be labeled, however. ! 80: .SH 2 "Keyword statements" ! 81: .pp ! 82: A keyword statement begins with one of the many predefined ! 83: keywords known to ! 84: .i as ; ! 85: the syntax of the remainder of the statement depends ! 86: on the keyword. ! 87: All instruction opcodes are keywords. ! 88: The remaining keywords are assembler pseudo-operations, ! 89: also called ! 90: .i directives . ! 91: The pseudo-operations are listed in \(sc8, ! 92: together with the syntax they require. ! 93: .SH 1 "Expressions" ! 94: .pp ! 95: An expression is a sequence of symbols representing a value. ! 96: Its constituents are identifiers, ! 97: constants, ! 98: operators, ! 99: and parentheses. ! 100: Each expression has a type. ! 101: .pp ! 102: All operators in expressions are fundamentally binary in ! 103: nature. ! 104: Arithmetic is two's complement and has 32 bits of precision. ! 105: .i As ! 106: can not do arithmetic on floating point numbers, quad or octal ! 107: precision scalar numbers. ! 108: There are four levels of precedence, ! 109: listed here from ! 110: lowest precedence level to highest: ! 111: .(b ! 112: .TS ! 113: center; ! 114: c l. ! 115: precedence operators ! 116: _ ! 117: binary $+$, $-$ ! 118: binary \fI\(bv\fP\|, $&$, $italic "^"$, $!$ ! 119: binary $*$, $/$, $%$, ! 120: unary $-$, $italic "~"$ ! 121: .TE ! 122: .)b ! 123: .pp ! 124: All operators of the same precedence are evaluated strictly left to right, ! 125: except for the evaluation order enforced by parenthesis. ! 126: .SH 2 "Expression Operators" ! 127: .pp ! 128: The operators are: ! 129: .(b ! 130: .TS ! 131: center; ! 132: c l. ! 133: operator meaning ! 134: _ ! 135: $+$ addition ! 136: $-$ (binary) subtraction ! 137: $*$ multiplication ! 138: $/$ division ! 139: $%$ modulo ! 140: $-$ (unary) 2's complement ! 141: $&$ bitwise and ! 142: $\(bv$ bitwise or ! 143: $italic "^"$ bitwise exclusive or ! 144: $!$ bitwise or not ! 145: $italic "~"$ bitwise 1's complement ! 146: $>$ logical right shift ! 147: $>>$ logical right shift ! 148: $<$ logical left shift ! 149: $<<$ logical left shift ! 150: .TE ! 151: .)b ! 152: .pp ! 153: Expressions may be grouped by use of parentheses, ! 154: .q "(" ! 155: and ! 156: .q ")". ! 157: .SH 2 "Data Types" ! 158: .pp ! 159: The assembler manipulates several different ! 160: types of expressions. ! 161: The types likely to be met explicitly are: ! 162: .nr ii \w'undefined\ \ 'u ! 163: .ip "undefined" ! 164: Upon first encounter, ! 165: each symbol is undefined. ! 166: It may become undefined if it is assigned an undefined expression. ! 167: It is an error to attempt to assemble an undefined ! 168: expression in pass 2; ! 169: in pass 1, ! 170: it is not (except that ! 171: certain keywords require operands which are not undefined). ! 172: .ip "undefined\ external" ! 173: A symbol which is declared ! 174: .b .globl ! 175: but not defined ! 176: in the current assembly is an undefined external. ! 177: If such a symbol is declared, ! 178: the link editor ! 179: .i ld ! 180: must be used to load the assembler's output with ! 181: another routine that defines the undefined reference. ! 182: .ip "absolute" ! 183: An absolute symbol is defined ultimately from a constant. ! 184: Its value is unaffected by any possible future applications ! 185: of the link-editor to the output file. ! 186: .ip "text" ! 187: The value of a text symbol is measured ! 188: with respect to the beginning of the text segment of the program. ! 189: If the assembler output is link-edited, ! 190: its text symbols may change in value ! 191: since the program need ! 192: not be the first in the link editor's output. ! 193: Most text symbols are defined by appearing as labels. ! 194: At the start of an assembly, ! 195: the value of ! 196: .q "\|\fB.\fP\|" ! 197: is ! 198: .q "text 0" . ! 199: .ip "data" ! 200: The value of a data symbol is measured ! 201: with respect to the origin of the data segment of a program. ! 202: Like text symbols, ! 203: the value of a data symbol may change ! 204: during a subsequent link-editor run since previously ! 205: loaded programs may have data segments. ! 206: After the first ! 207: .b .data ! 208: statement, ! 209: the value of ! 210: .q "\|\fB.\fP\|" ! 211: is ! 212: .q "data 0". ! 213: .ip "bss" ! 214: The value of a bss symbol is measured from ! 215: the beginning of the bss segment of a program. ! 216: Like text and data symbols, ! 217: the value of a bss symbol ! 218: may change during a subsequent link-editor run, ! 219: since previously loaded programs may have bss segments. ! 220: .ip "external\ absolute,\ text,\ data,\ or\ bss" ! 221: Symbols declared ! 222: .b .globl ! 223: but defined within an assembly as absolute, ! 224: text, ! 225: data, ! 226: or bss ! 227: symbols may be used exactly as if they were not ! 228: declared ! 229: .b .globl ; ! 230: however, their value and type are available ! 231: to the link editor so that the program may be loaded with others ! 232: that reference these symbols. ! 233: .ip "register" ! 234: The symbols ! 235: .(q ! 236: .b "r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15" ! 237: .b "ap fp sp pc" ! 238: .)q ! 239: are predefined ! 240: as register symbols. ! 241: In addition, the ! 242: .q "%" ! 243: operator converts the following absolute expression whose ! 244: value is between 0 and 15 into a register reference. ! 245: .ip "other\ types\ \ " ! 246: Each keyword known to the assembler has a type which ! 247: is used to select the routine which processes ! 248: the associated keyword statement. ! 249: The behavior of such symbols ! 250: when not used as keywords is the same as if they were absolute. ! 251: .SH 2 "Type Propagation in Expressions" ! 252: .pp ! 253: When operands are combined by expression operators, ! 254: the result has a type which depends on the types ! 255: of the operands and on the operator. ! 256: The rules involved are complex to state but ! 257: were intended to be sensible and predictable. ! 258: For purposes of expression evaluation the ! 259: important types are ! 260: .(b ! 261: .TS ! 262: center; ! 263: l. ! 264: undefined ! 265: absolute ! 266: text ! 267: data ! 268: bss ! 269: undefined external ! 270: other ! 271: .TE ! 272: .)b ! 273: .pp ! 274: The combination rules are then ! 275: .nr ii 5n ! 276: .np ! 277: If one of the operands is undefined, ! 278: the result is undefined. ! 279: .np ! 280: If both operands are absolute, ! 281: the result is absolute. ! 282: .np ! 283: If an absolute is combined with one of the ! 284: .q "other types" ! 285: mentioned above, ! 286: the result has the other type. ! 287: An ! 288: .q "other type" ! 289: combined with an explicitly ! 290: discussed type other than absolute ! 291: it acts like an absolute. ! 292: .pp ! 293: Further rules applying to particular operators are: ! 294: .ip "$+$" ! 295: If one operand is text-, data-, or bss-segment ! 296: relocatable, or is an undefined external, ! 297: the result has the postulated type and the other operand ! 298: must be absolute. ! 299: .ip $-$ ! 300: If the first operand is a relocatable ! 301: text-, data-, or bss-segment symbol, the second operand ! 302: may be absolute (in which case the result has the ! 303: type of the first operand); ! 304: or the second operand may have the same type ! 305: as the first (in which case the result is absolute). ! 306: If the first operand is external undefined, ! 307: the second must be absolute. ! 308: All other combinations are illegal. ! 309: .ip others ! 310: It is illegal to apply these operators to any but absolute symbols.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.