|
|
1.1 ! root 1: Microsoft Macro Assembler Package ! 2: Version 5.00 ! 3: ! 4: If you purchased the Macro Assembler package as an update to a ! 5: previous version, you did not receive a registration card. ! 6: This is not a mistake. The update is only available to ! 7: registered owners, who do not need to reregister. ! 8: ! 9: Text files on the Macro Assembler disks are tabbed to save ! 10: disk space. If your printer does not automatically handle ! 11: tabs during printing, you must use a print program that ! 12: expands tabs. For example, use the DOS PRINT program to print ! 13: this and other document or source files on the disk. ! 14: ! 15: ==( MASM.EXE )== ! 16: ! 17: New Feature ! 18: ! 19: The /LA option has been added to specify a complete listing ! 20: of all symbols, macros, and false conditionals. It is ! 21: equivalent to using the .LIST, .LFCOND, .LALL, and .CREF ! 22: directives throughout the source file. The option overrides ! 23: any conflicting directives in the source file. ! 24: ! 25: Clarification ! 26: ! 27: The PTR operator can be used to specify the size of a ! 28: register indirect operand for a CALL or JMP instruction. ! 29: However, the size cannot be specified with NEAR or FAR. Use ! 30: WORD or DWORD instead. (In 80386 32-bit segments, use DWORD ! 31: or FWORD.) Examples are shown below: ! 32: ! 33: ; 8086, 80826, or 80386 16-bit mode ! 34: ! 35: jmp WORD PTR [bx] ; Legal near jump ! 36: call NEAR PTR [bx] ; Illegal near call ! 37: call DWORD PTR [bx] ; Legal far call ! 38: jmp FAR PTR [bx] ; Illegal far jump ! 39: ! 40: ; 80386 32-bit mode only ! 41: ! 42: jmp DWORD PTR [bx] ; Legal near jump ! 43: call NEAR PTR [bx] ; Illegal near call ! 44: call FWORD PTR [bx] ; Legal far call ! 45: jmp FAR PTR [bx] ; Illegal far jump ! 46: ! 47: This limitation only applies to register indirect operands. ! 48: NEAR or FAR can be applied to operands associated with ! 49: labels. Examples are shown below: ! 50: ! 51: jmp NEAR PTR pointer[bx] ; Legal ! 52: call FAR PTR location ; Legal ! 53: ! 54: Correction ! 55: ! 56: When evaluating expressions, MASM does 16-bit arithmetic ! 57: except when the 80386 processor is enabled. If the .386 or ! 58: .386P directive has been given, MASM does 32-bit arithmetic. ! 59: This behavior is consistent with earlier versions of MASM, ! 60: which always did 16-bit arithmetic. The notes in Sections ! 61: 9.2.1, 9.2.1.5, and 9.2.2 of the Programmer's Guide are ! 62: incorrect. MASM extends constant operands to 17 bits (33 bits ! 63: with .386) before calculations, but then truncates the result ! 64: to 16 bits (32 bits with .386). The EQ and NE operators work ! 65: on 16-bit operands (32-bit with .386), but the LT, LE, GT, and ! 66: GE operators work on 17-bit (33-bit with .386) operands. ! 67: ! 68: Clarification ! 69: ! 70: The @FARDATA predefined equate mentioned in Section 5.1.5 does ! 71: not exist. References to this equate and examples of it in ! 72: several parts of the Programmer's Guide are incorrect. In ! 73: particular, the description of declaring external symbols in ! 74: Section 8.2 is incomplete and the example is incorrect. You ! 75: cannot access the segment of an external far data variable ! 76: with the @FARDATA equate or with the segment name FAR_DATA. ! 77: Instead you must use the SEG operator as shown below: ! 78: ! 79: .FARDATA ! 80: EXTRN fvar:WORD ; FAR variable in far data ! 81: .CODE ! 82: start: ASSUME es:SEG fvar ; Tell the assembler ! 83: mov ax,SEG fvar ; Tell the processor ! 84: mov es,ax ! 85: ! 86: This is the same limitation described for communal variables ! 87: in Section 8.4. The reason is that under the DOS segment ! 88: conventions, multiple far data segments share the same name ! 89: (FAR_DATA) and have private combine type. Segments with the ! 90: same name can only be distinguished indirectly using the SEG ! 91: operator. ! 92: ! 93: Clarification ! 94: ! 95: New CS assume statements are automatically given each time you ! 96: use the .CODE directive, as shown below: ! 97: ! 98: .CODE TASK1 ; Does ASSUME CS:TASK1_TEXT ! 99: . ! 100: . ! 101: . ! 102: .CODE TASK2 ; Does ASSUME CS:TASK2_TEXT ! 103: . ! 104: . ! 105: . ! 106: ! 107: Clarification ! 108: ! 109: The .286P and .386P processor directives enable instructions ! 110: that are normally used in systems programming. However, ! 111: some of these instructions do not necessarily require that ! 112: the processor be in privileged or protected mode. ! 113: ! 114: Correction ! 115: ! 116: Public absolute symbols must be declared during pass 1. This ! 117: means that aliases for absolute symbols or other forward ! 118: references to them will cause errors. For example, the ! 119: following code generates an error: ! 120: ! 121: PUBLIC lines ! 122: lines EQU rows ! 123: rows EQU 25 ! 124: ! 125: This behavior is different than in previous versions of MASM ! 126: and contrary to the note in Section 8.1. ! 127: ! 128: Behavior Change ! 129: ! 130: Some errors and questionable practices that were ignored by ! 131: earlier versions are now flagged as errors. As a result, ! 132: existing source code may produce errors or warnings. ! 133: The following are examples: ! 134: ! 135: - Labels defined only during pass 1 will cause errors if ! 136: used in expressions. ! 137: - A CS assume that changes from pass 1 to pass 2 causes ! 138: an error. ! 139: - Constants are now checked for type overflow. ! 140: - Reserved words used as labels produce warnings. ! 141: - The OFFSET operator used with a constant produces a ! 142: warning. ! 143: ! 144: Correction ! 145: ! 146: The assembler documentation indicates in several places that ! 147: CX will be 0 following a SCAS or CMPS instruction if no match ! 148: is found. This is misleading since CX may also be zero after ! 149: a search or compare in which the last string element matches. ! 150: ! 151: Testing the zero flag is more reliable. After a REPNE ! 152: comparison or scan, the zero flag will be cleared if no match ! 153: was found. After a REPE comparison or scan, the zero flag ! 154: will be set if no nonmatch was found. This correction affects ! 155: the following references: ! 156: ! 157: Assembler Reference ! 158: ! 159: CMPS instruction, last paragraph ! 160: ! 161: SCAS instruction, last paragraph ! 162: ! 163: Programmer's Guide ! 164: ! 165: Section 18.3, last paragraph of description; in example, ! 166: change "JCXZ notfound" to "JNZ notfound" ! 167: ! 168: Section 18.4, last paragraph of description; in example, ! 169: change "JCXZ allmatch" to "JZ allmatch" ! 170: ! 171: Other Corrections ! 172: ! 173: Section Description ! 174: ! 175: 5.2.2 The segment align, combine, use, and class types ! 176: can be given in ANY order. ! 177: ! 178: 13.3 Pushing a value DECREASES the value of SP. Popping ! 179: INCREASES the value. ! 180: ! 181: 16.3 When two 16-bit numbers are multiplied with MUL or ! 182: IMUL, the LEAST-signicant bits of the product will ! 183: be in AX and the MOST-significant bits in DX. ! 184: ! 185: 16.4 To divide a 32-bit number by a 16-bit number with ! 186: DIV or IDIV, put the LEAST-signicant bits in AX ! 187: and the MOST-significant bits in DX. ! 188: ! 189: 16.5 In several cases, the registers and values ! 190: described in text do not match those used in the ! 191: examples. The examples are correct. ! 192: ! 193: ==( MASM.EXE, LINK.EXE, and LIB.EXE )== ! 194: ! 195: Clarification ! 196: ! 197: The description of STACK combine type in Section 5.2.2.3 ! 198: does not explain how multiple initialized stack segments are ! 199: combined. The total size of the stack is the total size of ! 200: all stack definitions. LINK puts initialized data for each ! 201: defined stack segment at the end of the stack. Data initialized ! 202: in the last segment linked overrides data initialized in ! 203: previoussegments. This behavior is usually not relevant, since ! 204: most programs only define one stack of uninitialized data. ! 205: Stack data cannot be initialized with simplified segment ! 206: directives. ! 207: ! 208: New Feature ! 209: ! 210: The /NOE[XTDICTIONARY] option has been added to the linker. It ! 211: Tells the linker not to use the extended dictionary in ! 212: searching libraries. Use this option if you redefine a ! 213: standard-library routine (such as _setargv or _nullcheck) in a ! 214: program module, or if you get linker error L2044 during ! 215: linking. This option may slow linking on some programs. ! 216: ! 217: The "extended dictionary" is a block of data telling the linker ! 218: about interlibrary dependencies; that is, for each module in ! 219: the library, the extended dictionary tells the linker which ! 220: other modules in the same library are also required. Although ! 221: the linker can process libraries faster with this information, ! 222: it has trouble in processing if you redefine symbols (such as ! 223: the names of standard-library routines) that otherwise would ! 224: have been defined in one of the modules described in the ! 225: extended dictionary. ! 226: ! 227: One new LINK error message and two LIB messages have been ! 228: added to support this option. The linker message is shown ! 229: below: ! 230: ! 231: L2044 <name> : symbol multiply defined, use /NOE ! 232: ! 233: The message indicates that the linker found what it interprets ! 234: as a public-symbol redefinition, probably because you have ! 235: redefined a symbol that is defined in a library. Relink with ! 236: the /NOE option. If error L2025 results for the same symbol, ! 237: then you have a genuine symbol-redefinition error. ! 238: ! 239: The following LIB messages are new: ! 240: ! 241: U4157 insufficient memory, extended dictionary not created ! 242: U4158 internal error, extended dictionary not created ! 243: ! 244: This indicates that LIB could not create an extended ! 245: dictionary. The library is still valid, but the linker will ! 246: not be able to take advantage of the extended dictionary to ! 247: speed linking. ! 248: ! 249: New Feature ! 250: ! 251: LIB has a new option, /N[OIGNORECASE]. It tells LIB to ignore ! 252: case when comparing symbols in the extended and regular ! 253: dictionaries. The default is to ignore case. ! 254: ! 255: New Message ! 256: ! 257: The following new LINK message warns about a practice that is ! 258: legal in real mode, but illegal in protected mode: ! 259: ! 260: warning L4003: intersegment self-relative fixup at <position> ! 261: ! 262: In assembly-language, the warning only occurs if the DOSSEG ! 263: directive or /DOSSEG linker option is used. It indicates a ! 264: 16-bit jump to an address in another segment. For example, ! 265: the following code produces the error: ! 266: ! 267: _TEXT SEGMENT ! 268: EXTRN doit:NEAR ! 269: jmp _TEXT2:doit ! 270: . ! 271: . ! 272: . ! 273: _TEXT ENDS ! 274: ! 275: _TEXT2 SEGMENT ! 276: PUBLIC doit ! 277: doit PROC NEAR ! 278: . ! 279: . ! 280: . ! 281: doit ENDP ! 282: _TEXT2 ENDS ! 283: ! 284: The warning usually indicates a fatal error in high-level- ! 285: language programs. It can occur when the /NT option is used ! 286: to compile a small-model C program. ! 287: ! 288: New Messages ! 289: ! 290: The following LINK messages are related to quick libraries. ! 291: See you QuickBASIC or QuickC documentation for details: ! 292: ! 293: L2043 Quick Library support module missing ! 294: L1003 /QUICKLIB, /EXEPACK incompatible ! 295: L1115 /QUICKLIB, overlays incompatible ! 296: ! 297: New Message ! 298: ! 299: The following new LIB message warns that a module specified to ! 300: be replaced does not exist in the library: ! 301: ! 302: U4155 <modulename> : module not in library ! 303: ! 304: LIB adds the module anyway. ! 305: ! 306: ==( CodeView Debugger )== ! 307: ! 308: New Feature ! 309: ! 310: The /R option has been added to enable the CodeView debugger ! 311: to use the debug registers (DR0, DR1, DR2, and DR3) of the ! 312: 80386 processor. The option is ignored if you do not have an ! 313: 80386 processor. ! 314: ! 315: The display does not change to indicate that the debug ! 316: registers are in use, but debugger operations with ! 317: tracepoint or trace memory statements (but not with ! 318: watchpoint statements) will be much faster. Any of the ! 319: following conditions will prevent the debugger from using ! 320: debug registers: ! 321: ! 322: 1) /E is used. ! 323: 2) More than four tracepoints are set. ! 324: 3) A tracepoint watches more than four bytes of memory. ! 325: 4) A watchpoint is set. ! 326: ! 327: Clarification ! 328: ! 329: The Pascal expression evaluator described in the CodeView ! 330: and Utilities manual is not implemented in this version of ! 331: the CodeView debugger. It will be implemented in the ! 332: debugger supplied with the next version of Pascal, which ! 333: will also produce executable files with CodeView symbolic ! 334: information. Current versions of Pascal do not work with the ! 335: CodeView debugger. ! 336: ! 337: Corrections ! 338: ! 339: Section 4.2 of the CodeView and Utilities manual should mention ! 340: that FORTRAN relational operators do not work with string ! 341: variables or constants. ! 342: ! 343: Use the /Zi option, not /D as indicated in Sections 1.2.2 and ! 344: 1.2.6, when using BC to compile BASIC programs for the ! 345: CodeView debugger. ! 346: ! 347: Warning ! 348: ! 349: Some versions of the GENOA EGA short card are incompatible ! 350: with CodeView when used with a mouse. You can work around this ! 351: problem by turning off the mouse with /M. ! 352: ! 353: ==( CREF.EXE )== ! 354: ! 355: New Feature ! 356: ! 357: Cross-reference listing files created with CREF now have an ! 358: additional symbol. A line number followed by + indicates ! 359: that a symbol is modified at the given line. For example: ! 360: ! 361: TST . . . . . . . . . . . . . . 134# 237 544+ ! 362: ! 363: The symbol TST is defined at line 134, used at line 237, and ! 364: modified at line 544. ! 365: ! 366: ==( MAKE.EXE )== ! 367: ! 368: Warning ! 369: ! 370: MAKE considers a backslash immediately followed by a carriage ! 371: return-line feed to be a continuation character. When it finds ! 372: this combination in a description file, MAKE concatenates the ! 373: line immediately following to the current line. ! 374: ! 375: If you define a macro that ends in a backslash, make sure that ! 376: you put a space after the terminating backslash. For example: ! 377: ! 378: BINPATH=C:\SRC\BIN\<space><new-line> ! 379: LIBPATH=C:\SRC\LIB\<space><new-line> ! 380: ! 381: New Feature ! 382: ! 383: The new /X option has the following syntax: ! 384: ! 385: /X <filename> ! 386: ! 387: This option redirects errors output by MAKE, or by any ! 388: programs that MAKE runs, to the given file. If the <filename> ! 389: argument is a dash (-), MAKE redirects error output to STDOUT. ! 390: You may send both error output and standard output to the same ! 391: file by combining the "/X -" form of this option with DOS ! 392: redirection, as in the following example: ! 393: ! 394: MAKE /X - project.mak >make.log ! 395: ! 396: DO NOT specify the same file name for /X as the file name ! 397: following the redirection symbol (>). ! 398: ! 399: ==( ERROUT.EXE )== ! 400: ! 401: Correction ! 402: ! 403: The ERROUT utility does not accept batch files. To redirect ! 404: standard-error output from a batch file, you must enter a ! 405: command of the following form: ! 406: ! 407: ERROUT COMMAND /c <batchfile> ! 408: ! 409: If no /f option is given, ERROUT redirects standard-error ! 410: output to the standard-output device. ! 411: ! 412: ==( Exit Codes )== ! 413: ! 414: Exit codes returned by LINK, LIB, and MAKE have changed: ! 415: ! 416: Code Meaning ! 417: ! 418: 0 No error. ! 419: ! 420: 2 Program error. Something was wrong with the ! 421: commands or files input to the utility. ! 422: ! 423: 4 System error, such as a file error or user ! 424: interrupt. ! 425: ! 426: ! 427: ==( Mixed-Languages Programming Guide )== ! 428: ! 429: Correction ! 430: ! 431: C recognizes up to 31 characters of symbol names, not eight ! 432: as stated in Section 1.2. ! 433: ! 434: Clarification ! 435: ! 436: The example programs for BASIC in Chapter 6 will not work ! 437: with QuickBASIC Versions 2.0 or 3.0. They will work if you ! 438: rewrite the function as a subprogram, and omit the DECLARE ! 439: statement. Functions and DECLARE statements are supported ! 440: in QuickBASIC 4.0 and in future versions of Microsoft BASIC ! 441: compilers. ! 442: ! 443: Clarification ! 444: ! 445: Section 6.6 of the Mixed Languages Programming Guide gives ! 446: instructions for setting up a call to a high-level language ! 447: from assembly language. Before you execute a call to a BASIC, ! 448: Pascal, or FORTRAN routine, declare an additional parameter if ! 449: the return value is noninteger. This additional parameter must ! 450: contain the offset address of the return value, for which you ! 451: must allocate room within the stack segment (normally DGROUP, ! 452: the same as the default data segment). ! 453: ! 454: ==( Macro Files )== ! 455: ! 456: New Feature ! 457: ! 458: Macro files have been added to the Macro Assembler package. ! 459: The following files are provided: ! 460: ! 461: MIXED.INC For defining assembler procedures ! 462: that can be called from high-level ! 463: languages ! 464: ! 465: MIXED.DOC Documentation for the macros in ! 466: MIXED.INC. ! 467: ! 468: DOS.INC For calling common DOS interrupts ! 469: ! 470: BIOS.INC For calling common BIOS interrupts ! 471: used on IBM and IBM-compatible computers ! 472: ! 473: MACRO.DOC Description, syntax, and reference ! 474: for using the macros in DOS.INC and ! 475: BIOS.INC.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.