|
|
1.1 ! root 1: .\" ! 2: .\" Copyright (c) 1982 Regents of the University of California ! 3: .\" @(#)asdocs3.me 1.6 2/11/83 ! 4: .\" ! 5: .EQ ! 6: delim $$ ! 7: .EN ! 8: .SH 1 "Pseudo-operations (Directives)" ! 9: .pp ! 10: The keywords listed below introduce directives or instructions, ! 11: and influence the later behavior of the assembler for this statement. ! 12: The metanotation ! 13: .ce 1 ! 14: [ stuff ] ! 15: .ce 0 ! 16: means that 0 or more instances of the given ! 17: .q stuff ! 18: may appear. ! 19: .pp ! 20: .b Boldface ! 21: tokens must appear literally; ! 22: words in ! 23: .i italic ! 24: words are substitutable. ! 25: .pp ! 26: The pseudo\-operations listed below ! 27: are grouped into functional categories. ! 28: .SH 2 "Interface to a Previous Pass" ! 29: .(b ! 30: .in -2n ! 31: .TS ! 32: lb l. ! 33: \&.ABORT ! 34: .TE ! 35: .in +2n ! 36: .)b ! 37: .pp ! 38: As soon as the assembler sees this directive, ! 39: it ignores all further input ! 40: (but it does read to the end of file), ! 41: and aborts the assembly. ! 42: No files are created. ! 43: It is anticipated that this would be used in a pipe interconnected ! 44: version of a compiler, ! 45: where the first major syntax error would ! 46: cause the compiler to issue this directive, ! 47: saving unnecessary work in assembling code ! 48: that would have to be discarded anyway. ! 49: .(b ! 50: .in -2n ! 51: .TS ! 52: lb l. ! 53: \&.file $string$ ! 54: .TE ! 55: .in +2n ! 56: .)b ! 57: .pp ! 58: This directive causes the assembler to think it is in file ! 59: .i string , ! 60: so error messages reflect the proper source file. ! 61: .(b ! 62: .in -2n ! 63: .TS ! 64: lb l. ! 65: \&.line $expression$ ! 66: .TE ! 67: .in +2n ! 68: .)b ! 69: .pp ! 70: This directive causes the assembler to think it is on line ! 71: .i expression ! 72: so error messages reflect the proper source file. ! 73: .pp ! 74: The only effect of assembling multiple files specified in the command string ! 75: is to insert the ! 76: .i file ! 77: and ! 78: .i line ! 79: directives, ! 80: with the appropriate values, ! 81: at the beginning of the source from each file. ! 82: .(b ! 83: .in -2n ! 84: .TS ! 85: lb l. ! 86: # $expression$ $string$ ! 87: # $expression$ ! 88: .TE ! 89: .in +2n ! 90: .)b ! 91: .pp ! 92: This is the only instance where a comment is meaningful to the assembler. ! 93: The ! 94: .q "#" ! 95: .ul 1 ! 96: must ! 97: be in the first column. ! 98: This meta comment causes the assembler ! 99: to believe it is on line ! 100: .i expression . ! 101: The second argument, ! 102: if included, ! 103: causes the assembler to believe it is in file ! 104: .i string , ! 105: otherwise the current file name does not change. ! 106: .SH 2 "Location Counter Control" ! 107: .(b ! 108: .in -2n ! 109: .TS ! 110: lb l. ! 111: \&.data [ $expression$ ] ! 112: \&.text [ $expression$ ] ! 113: .TE ! 114: .in +2n ! 115: .)b ! 116: .pp ! 117: These two pseudo-operations cause the ! 118: assembler to begin assembling into the indicated text or data ! 119: subsegment. ! 120: If specified, ! 121: the ! 122: .i expression ! 123: must be defined and absolute; ! 124: an omitted ! 125: .i expression ! 126: is treated as zero. ! 127: The effect of a ! 128: .b .data ! 129: directive is treated ! 130: as a ! 131: .b .text ! 132: directive if the ! 133: .b \-R ! 134: assembly flag is set. ! 135: Assembly starts in the ! 136: .b ".text" ! 137: 0 subsegment. ! 138: .pp ! 139: The directives ! 140: .b .align ! 141: and ! 142: .b .org ! 143: also control the placement of the location counter. ! 144: .sh 2 "Filled Data" ! 145: .(b ! 146: .in -2n ! 147: .TS ! 148: lb l. ! 149: \&.align $align\*(USexpr$ [ \fB,\fP $fill\*(USexpr$ ] ! 150: .TE ! 151: .in +2n ! 152: .)b ! 153: .pp ! 154: The location counter is adjusted ! 155: so that the ! 156: .i expression ! 157: lowest bits of the location counter become zero. ! 158: This is done by ! 159: assembling from 0 to $2 sup align\*(USexpr$ bytes, ! 160: taken from the low order byte of $fill\*(USexpr$. ! 161: If present, ! 162: $fill\*(USexpr$ must be absolute; ! 163: otherwise it defaults to 0. ! 164: Thus ! 165: .q ".align 2" ! 166: pads by null bytes to make the location counter ! 167: evenly divisible by 4. ! 168: The ! 169: .i align_expr ! 170: must be defined, ! 171: absolute, nonnegative, ! 172: and less than 16. ! 173: .pp ! 174: Warning: ! 175: the subsegment concatenation convention ! 176: and the current loader conventions ! 177: may not preserve attempts at aligning ! 178: to more than 2 low-order zero bits. ! 179: .(b ! 180: .in -2n ! 181: .TS ! 182: lb l. ! 183: \&.org $org\*(USexpr$ [ \fB,\fP $fill\*(USexpr$ ] ! 184: .TE ! 185: .in +2n ! 186: .)b ! 187: .pp ! 188: The location counter is set equal to the value of $org\*(USexpr$, ! 189: which must be defined and absolute. ! 190: The value of the $org\*(USexpr$ ! 191: must be greater than the current value ! 192: of the location counter. ! 193: Space between the current value of the location counter ! 194: and the desired value are filled with bytes taken from the ! 195: low order byte of $fill\*(USexpr$, ! 196: which must be absolute and defaults to 0. ! 197: .(b ! 198: .in -2n ! 199: .TS ! 200: lb l. ! 201: \&.space $space\*(USexpr$ [ \fB,\fP $fill\*(USexpr$ ] ! 202: .TE ! 203: .in +2n ! 204: .)b ! 205: .pp ! 206: The location counter is advanced by ! 207: $space\*(USexpr$ bytes. ! 208: $Space\*(USexpr$ must be defined and absolute. ! 209: The space is filled in with bytes taken from the low order ! 210: byte of $fill\*(USexpr$, ! 211: which must be defined and absolute. ! 212: $Fill\*(USexpr$ defaults to 0. ! 213: The ! 214: .b .fill ! 215: directive is a more general way to accomplish the ! 216: .b .space ! 217: directive. ! 218: .(b ! 219: .in -2n ! 220: .TS ! 221: lb l. ! 222: \&.fill $rep\*(USexpr$\fB,\fP $size\*(USexpr$\fB,\fP $fill\*(USexpr$ ! 223: .TE ! 224: .in +2n ! 225: .)b ! 226: .pp ! 227: All three expressions must be absolute. ! 228: .i fill\*(USexpr , ! 229: treated as an expression of size ! 230: .i size\*(USexpr ! 231: bytes, ! 232: is assembled and replicated ! 233: .i rep\*(USexpr ! 234: times. ! 235: The effect is to advance the current location counter ! 236: .i rep\*(USexpr ! 237: \(** ! 238: .i size\*(USexpr ! 239: bytes. ! 240: .i size\*(USexpr ! 241: must be between 1 and 8. ! 242: .SH 2 "Symbol Definitions" ! 243: .SH 2 "Initialized Data" ! 244: .(b ! 245: .in -2n ! 246: .TS ! 247: lb l. ! 248: \&.byte $expr$ [ \fB,\fP $expr$ ] ! 249: \&.word $expr$ [ \fB,\fP $expr$ ] ! 250: \&.int $expr$ [ \fB,\fP $expr$ ] ! 251: \&.long $expr$ [ \fB,\fP $expr$ ] ! 252: .TE ! 253: .in +2n ! 254: .)b ! 255: .pp ! 256: The ! 257: .i expression s ! 258: in the comma-separated ! 259: list are truncated to the size indicated by the key word: ! 260: .(b ! 261: .in -2n ! 262: .TS ! 263: center; ! 264: c l ! 265: cb n. ! 266: keyword length (bits) ! 267: _ ! 268: \&.byte 8 ! 269: \&.word 16 ! 270: \&.int 32 ! 271: \&.long 32 ! 272: .TE ! 273: .in +2n ! 274: .)b ! 275: and assembled in successive locations. ! 276: The ! 277: .i expression s ! 278: must be absolute. ! 279: .pp ! 280: Each ! 281: .i expression ! 282: may optionally be of the form: ! 283: .(b ! 284: .TS ! 285: center; ! 286: l. ! 287: $expression sub 1$ : $expression sub 2$ ! 288: .TE ! 289: .)b ! 290: In this case, ! 291: the value of $expression sub 2$ is truncated ! 292: to $expression sub 1$ bits, ! 293: and assembled in the next $expression sub 1$ bit field ! 294: which fits in the natural data size being assembled. ! 295: Bits which are skipped because a field does not fit are filled with zeros. ! 296: Thus, ! 297: .q "\fB.byte\fP 123" ! 298: is equivalent to ! 299: .q "\fB.byte\fP 8:123" , ! 300: and ! 301: .q "\fB.byte\fP 3:1,2:1,5:1" ! 302: assembles two bytes, containing the values 9 and 1. ! 303: .pp ! 304: .b NB: ! 305: Bit field initialization with the colon operator is likely ! 306: to disappear in future releases of the assembler. ! 307: .(b ! 308: .in -2n ! 309: .TS ! 310: lb l. ! 311: \&.quad $number$ [ , $number$ ] ! 312: \&.octa $number$ [ , $number$ ] ! 313: \&.float $number$ [ , $number$ ] ! 314: \&.double $number$ [ , $number$ ] ! 315: \&.ffloat $number$ [ , $number$ ] ! 316: \&.dfloat $number$ [ , $number$ ] ! 317: \&.gfloat $number$ [ , $number$ ] ! 318: \&.hfloat $number$ [ , $number$ ] ! 319: .TE ! 320: .in +2n ! 321: .)b ! 322: .pp ! 323: These initialize Bignums (see \(sc3.2.2) ! 324: in successive locations whose size is a function on the key word. ! 325: The type of the Bignums ! 326: (determined by the exponent field, or lack thereof) ! 327: may not agree with type implied by the key word. ! 328: The following table shows the key words, ! 329: their size, ! 330: and the data types for the Bignums they expect. ! 331: .(b ! 332: .in -2n ! 333: .TS ! 334: center; ! 335: c l l l ! 336: rb n l l. ! 337: keyword format length (bits) valid $number$(s) ! 338: _ ! 339: \&.quad quad scalar 64 scalar ! 340: \&.octa octal scalar 128 scalar ! 341: \&.float F float 32 F, D and scalar ! 342: \&.ffloat F float 32 F, D and scalar ! 343: \&.double D float 64 F, D and scalar ! 344: \&.dfloat D float 64 F, D and scalar ! 345: \&.gfloat G float 64 G scalar ! 346: \&.hfloat H float 128 H scalar ! 347: .TE ! 348: .in +2n ! 349: .)b ! 350: .pp ! 351: .i As ! 352: will correctly perform other floating point conversions while initializing, ! 353: but issues a warning message. ! 354: .i As ! 355: performs all floating point initializations and conversions ! 356: using only the facilities defined ! 357: in the original (native) architecture. ! 358: .(b ! 359: .in -2n ! 360: .TS ! 361: lb l. ! 362: \&.ascii $string$ [ , $string$] ! 363: \&.asciz $string$ [ , $string$] ! 364: .TE ! 365: .in +2n ! 366: .)b ! 367: .pp ! 368: Each ! 369: .i string ! 370: in the list is assembled into successive locations, ! 371: with the first letter in the string being placed ! 372: into the first location, etc. ! 373: The ! 374: .b .ascii ! 375: directive will not null pad the string; ! 376: the ! 377: .b .asciz ! 378: directive will null pad the string. ! 379: (Recall that strings are known by their length, ! 380: and need not be terminated with a null, ! 381: and that the \*(CL conventions for escaping are understood.) ! 382: The ! 383: .b .ascii ! 384: directive is identical to: ! 385: .br ! 386: .b .byte ! 387: $string sub 0$ ! 388: .b , ! 389: $string sub 1$ ! 390: .b , ! 391: $...$ ! 392: .br ! 393: .(b ! 394: .in -2n ! 395: .TS ! 396: lb l. ! 397: \&.comm $name$\fB,\fP $expression$ ! 398: .TE ! 399: .in +2n ! 400: .)b ! 401: .pp ! 402: Provided the ! 403: .i name ! 404: is not defined elsewhere, ! 405: its type is made ! 406: .q "undefined external" , ! 407: and its value is ! 408: .i expression . ! 409: In fact the ! 410: .i name ! 411: behaves ! 412: in the current assembly just like an ! 413: undefined external. ! 414: However, ! 415: the link editor ! 416: .i ld ! 417: has been special-cased ! 418: so that all external symbols which are not otherwise defined, ! 419: and which have a non-zero value, ! 420: are defined to lie in the bss segment, ! 421: and enough space is left after the symbol to hold ! 422: .i expression ! 423: bytes. ! 424: .(b ! 425: .in -2n ! 426: .TS ! 427: lb l. ! 428: \&.lcomm $name$\fB,\fP $expression$ ! 429: .TE ! 430: .in +2n ! 431: .)b ! 432: .pp ! 433: .i expression ! 434: bytes will be allocated in the bss segment and ! 435: .i name ! 436: assigned the location of the first byte, ! 437: but the ! 438: .i name ! 439: is not declared ! 440: as global and hence will be unknown to the link editor. ! 441: .(b ! 442: .in -2n ! 443: .TS ! 444: lb l. ! 445: \&.globl $name$ ! 446: .TE ! 447: .in +2n ! 448: .)b ! 449: .pp ! 450: This statement makes the ! 451: .i name ! 452: external. ! 453: If it is otherwise defined (by ! 454: .b .set ! 455: or by ! 456: appearance as a label) ! 457: it acts within the assembly exactly as if ! 458: the ! 459: .b .globl ! 460: statement were not given; ! 461: however, ! 462: the link editor may be used ! 463: to combine this object module with other modules referring to this symbol. ! 464: .pp ! 465: Conversely, ! 466: if the given symbol is not defined ! 467: within the current assembly, ! 468: the link editor can combine the output of this assembly ! 469: with that of others which define the symbol. ! 470: The assembler makes all otherwise ! 471: undefined symbols external. ! 472: .(b ! 473: .in -2n ! 474: .TS ! 475: lb l. ! 476: \&.set $name$\fB,\fP $expression$ ! 477: .TE ! 478: .in +2n ! 479: .)b ! 480: .pp ! 481: The ($name$, $expression$) ! 482: pair is entered into the symbol table. ! 483: Multiple ! 484: .b .set ! 485: statements with the same name are legal; ! 486: the most recent value replaces all previous values. ! 487: .(b ! 488: .in -2n ! 489: .TS ! 490: lb l. ! 491: \&.lsym\& $name$\fB,\fP $expression$ ! 492: .TE ! 493: .in +2n ! 494: .)b ! 495: .pp ! 496: A unique and otherwise unreferencable instance of the ! 497: ($name$, $expression$) ! 498: pair is created in the symbol table. ! 499: The Fortran 77 compiler uses this mechanism to pass local symbol definitions ! 500: to the link editor and debugger. ! 501: .(b ! 502: .in -2n ! 503: .TS ! 504: lb l. ! 505: \&.stabs $string$, $expr sub 1$, $expr sub 2$, $expr sub 3$, $expr sub 4$ ! 506: \&.stabn $expr sub 1$, $expr sub 2$, $expr sub 3$, $expr sub 4$ ! 507: \&.stabd $expr sub 1$, $expr sub 2$, $expr sub 3$ ! 508: .TE ! 509: .in +2n ! 510: .)b ! 511: .pp ! 512: The ! 513: .i stab ! 514: directives place symbols in the symbol table for the symbolic ! 515: debugger, ! 516: .i sdb \**. ! 517: .(f ! 518: \**Katseff, H.P. ! 519: .i "Sdb: A Symbol Debugger." ! 520: Bell Laboratories, Holmdel, ! 521: NJ. April 12, 1979. ! 522: .br ! 523: Katseff, H.P. ! 524: .i "Symbol Table Format for Sdb", ! 525: File 39394, ! 526: Bell Laboratories, Holmdel, NJ. March 14, 1979. ! 527: .)f ! 528: A ! 529: .q stab ! 530: is a ! 531: .i s ymbol ! 532: .i tab le ! 533: entry. ! 534: The ! 535: .b .stabs ! 536: is a string stab, the ! 537: .b .stabn ! 538: is a stab not having a string, ! 539: and the ! 540: .b .stabd ! 541: is a ! 542: .q dot ! 543: stab that implicitly references ! 544: .q dot , ! 545: the current location counter. ! 546: .pp ! 547: The ! 548: .i string ! 549: in the ! 550: .b .stabs ! 551: directive is the name of a symbol. ! 552: If the symbol name is zero, ! 553: the ! 554: .b .stabn ! 555: directive may be used instead. ! 556: .pp ! 557: The other expressions are stored ! 558: in the name list structure ! 559: of the symbol table ! 560: and preserved by the loader for reference by ! 561: .i sdb ; ! 562: the value of the expressions are peculiar to formats required by ! 563: .i sdb . ! 564: .nr ii \w'$expr sub 1$\ \ 'u ! 565: .ip $expr sub 1$ ! 566: is used as a symbol table tag ! 567: (nlist field ! 568: .i n\*(UStype ). ! 569: .ip $expr sub 2$ ! 570: seems to always be zero ! 571: (nlist field ! 572: .i n\*(USother ). ! 573: .ip $expr sub 3$ ! 574: is used for either the ! 575: source line number, ! 576: or for a nesting level ! 577: (nlist field ! 578: .i n\*(USdesc ). ! 579: .ip $expr sub 4$ ! 580: is used as tag specific information ! 581: (nlist field ! 582: .i n\*(USvalue ). ! 583: In the ! 584: case of the ! 585: .b .stabd ! 586: directive, this expression is nonexistent, and ! 587: is taken to be the value of the location counter ! 588: at the following instruction. ! 589: Since there is no associated name for a ! 590: .b .stabd ! 591: directive, ! 592: it can ! 593: only be used in circumstances where the name is zero. ! 594: The effect of a ! 595: .b .stabd ! 596: directive can be achieved by one of the other ! 597: .b .stab x ! 598: directives in the following manner: ! 599: .br ! 600: $bold .stabn$ $expr sub 1$, $expr sub 2$, $expr sub 3$, $roman LL n$ ! 601: .br ! 602: $roman LL n bold :$ ! 603: .pp ! 604: The ! 605: .b .stabd ! 606: directive is preferred, ! 607: because it does not clog the symbol ! 608: table with labels used only for the stab symbol entries.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.