home *** CD-ROM | disk | FTP | other *** search
- ======================================================================
- Microsoft(R) Product Support Services Application Note (Text File)
- HA0620: Macro Assembler Questions & Answers
- ======================================================================
- Revision Date: 10/92
- No Disk Included
-
- The following information applies to Microsoft Macro Assembler
- versions 5.1 and 6.0.
-
- --------------------------------------------------------------------
- | INFORMATION PROVIDED IN THIS DOCUMENT AND ANY SOFTWARE THAT MAY |
- | ACCOMPANY THIS DOCUMENT (collectively referred to as an |
- | Application Note) IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY |
- | KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO |
- | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A |
- | PARTICULAR PURPOSE. The user assumes the entire risk as to the |
- | accuracy and the use of this Application Note. This Application |
- | Note may be copied and distributed subject to the following |
- | conditions: 1) All text must be copied without modification and |
- | all pages must be included; 2) If software is included, all files |
- | on the disk(s) must be copied without modification [the MS-DOS(R) |
- | utility DISKCOPY is appropriate for this purpose]; 3) All |
- | components of this Application Note must be distributed together; |
- | and 4) This Application Note may not be distributed for profit. |
- | |
- | Copyright 1992 Microsoft Corporation. All Rights Reserved. |
- | Microsoft and MS-DOS are registered trademarks and Windows |
- | is a trademark of Microsoft Corporation. |
- --------------------------------------------------------------------
-
- 1. Q. Why does my program hang or generate an illegal instruction
- when I use a .386, .386P, .486, or .486P processor directive?
-
- A. The 386 and 486 processors can operate with either 32-bit
- operations or 16-bit operations being the default. In either
- mode, a prefix byte (66h or 67h) at the beginning of the
- instruction tells the processor to treat an instruction as a
- nondefault operation. For example, if the processor sees a prefix
- byte while in a 16-bit segment, it executes the instruction as a
- 32-bit operation.
-
- When you assemble a file that uses full segment declarations,
- Macro Assembler assumes that the default operations are 32 bit.
- To change this assumption, you must use a USE16 modifier on the
- SEGMENT directive. When you assemble a file that uses simplified
- segment declarations, Macro Assembler assumes that the default
- operations are 32 bit if a .386, .386P, .486, or .486P comes
- before the .MODEL directive. Placing the processor directive
- after the .MODEL assumes the 16-bit default operations.
-
- 2. Q. Why can't I display my Microsoft Macro Assembler source code
- under Microsoft CodeView debugger?
-
- A. If you are using full segment directives in your Macro Assembler
- file, remember to give any code segments the class CODE. If they
- are not given the class CODE, you cannot display the source file
- when you enter CodeView.
-
- 3. Q. Why do I get errors when I try to reassemble the startup
- source code that came with Microsoft C version 6.0?
-
- A. These source files were assembled with Microsoft Macro Assembler
- version 5.1 and include .INC files that were written specifically
- for Macro Assembler 5.1. If you are using Macro Assembler 6.0,
- you need to use the .INC files that come with Macro Assembler
- 6.0. Also, place /DMS_STARTUP in the flags used by the assembler
- so that it uses the appropriate items out of the new .INC files.
-
- NOTE: These errors can also occur in Microsoft FORTRAN and
- earlier versions of Microsoft C Compiler.
-
- 4. Q. Why do I get an unresolved externals error when I link my
- assembly routine with Microsoft C Compiler?
-
- A. Microsoft C Compiler adds leading underscores to function and
- variable names and preserves the case of names. By default,
- Microsoft Macro Assembler does not add a leading underscore and
- converts names to all capital letters. To make the assembler
- match the behavior of the C compiler, use the .MODEL directive
- and specify the language. (For example, specify ".MODEL small,
- c.") To make the assembler preserve the case of names, use the
- /Cx assembler switch in Macro Assembler 6.0 and the /MX assembler
- switch in Macro Assembler versions 5.1 and earlier.
-
- 5. Q. Can I use Microsoft Programmer's WorkBench version 2.0,
- which comes with Microsoft C/C++ Compiler version 7.0, to invoke
- Microsoft Macro Assembler?
-
- A. Yes, you can invoke Macro Assembler 6.0 from Programmer's
- WorkBench 2.0. To do this, load the Macro Assembler extension
- file for Programmer's WorkBench (PWBMASM.XXT). This extension
- loads automatically if it has an .MXT extension and is located in
- the same directory as Programmer's WorkBench 2.0. However, this
- file, which is distributed with Programmer's WorkBench 2.0,
- initially has an .XXT extension. Use the MS-DOS RENAME command to
- rename the file from PWBMASM.XXT to PWBMASM.MXT.
-
- NOTE: The .MXT files that ship with Programmer's WorkBench 1.1
- do not work with Programmer's WorkBench 2.0.
-
- 6. Q. Why can't I place code at an absolute address with the
- SEGMENT AT and ORG directives?
-
- A. The linker that comes with Macro Assembler is designed to
- generate relocatable programs that can run under MS-DOS,
- Microsoft Windows, or OS/2. The linker is not designed to
- generate absolute addressable code. Third-party link and locate
- tools that generate absolute addressable code are available.
-
- The ORG directive is meant to give a relative offset to the first
- items in a segment (for example, 100h for .COM files). The
- SEGMENT AT directive is used when you want to access memory that
- is already in the computer at an absolute address (for example,
- the ROM BIOS).
-
- 7. Q. Why does my program hang when I return from a procedure?
-
- A. This problem typically occurs when the stack becomes corrupt. If
- you push any registers onto the stack upon entry into a
- procedure, you must pop those registers off the stack upon exit
- from the procedure. You must have both an equal number of pushes
- and pops and a RET instruction at the end of the procedure.
-
-