Myths About MASM
 

The name MASM has earlier usage as the Unisys Meta Assembler but since about 1990 when Microsoft introduce MASM version 6.0 the name MASM has normally been associated with the Microsoft Macro Assembler. MASM is a programming tool with a very long history and has been in constant development since it earliest version in 1981. Below is the copyright notice when ML.EXE version 6.14 is run from the command line.

Microsoft (R) Macro Assembler Version 6.14.8444 
Copyright (C) Microsoft Corp 1981-1997.  All rights reserved.

MASM preserves the historical INTEL notation for writing x86 assembler and it is a defacto industrial standard because of the length of time it has been a premier programming tool. From the late 80s onwards it has been compatible with whatever has been the current Microsoft object file format and this has made assembler modules written in MASM directly compatible with other Microsoft languages.

The current versions of ML.EXE (The assembler in MASM) as of late 2015 is version 11 with versions 9 and 10 being current for operating system version going back to Win7 but the architecture and format of current and recent versions of ML.EXE are based on the version 6.00 that was released in 1990. The technical data published in the manuals for version 6.00 and the last seperate release of MASM 6.11d as a commercial product still mainly apply to the most recent versions.

Microsoft released version 6.11d in 1993 including 32 bit Windows operating system capacity. It is the original win 32 assembler and was supported in that release with 32 bit assembler code examples that would run on the early 32 bit versions of Windows NT.

Debunking the myths about MASM

1. MASM is no longer supported or upgraded by Microsoft. 

Nobody has told this to Microsoft who supply ML.EXE 9.0 in the Win7 DDK and version 10 and 11 for later Windows versions. It has been a component of the Microsoft Visual C/Studios commercial development environment since it was made available as a processor pack in 2000 for VC98. It is upgraded on a needs basic by Microsoft noting that it has been in constant development since 1981 and does not need much done to it apart from the occasional upgrade to reflect operating system and hardware changes. It is well known that Microsoft use MASM to write critical parts of their own operating systems.

2. MASM produces bloated files that are larger than true low level assemblers. 

This folklore does not fit the facts. In 16 bit code MASM can produce a 2 byte com file (int 19h) and in modern 32 bit PE (Portable Executable) files, it can produce a 1024 byte working window which is the PE specification minimum size for a PE file. Much of this folklore was invented in the middle 90s by people who could not ever write assembler code in MASM.

3. MASM is not a true low level assembler. 

MASM can write at the lowest possible level in an assembler with direct DB sequences in the code section. The recent versions can write the entire Intel instruction set up to SSE4+. Many confuse the higher level simulations in MASM with the incapacity to write true low level code. MASM is the architypal MACRO assembler for the Windows platform and this macro capacity is powerful enough to emulate many forms of higher level constructions.

4. MASM is only an accessory for C programming. 

Nobody seems to have told this to the hundreds of thousands of assembler programmers who write executable programs and dynamic link libraries for 32 bit Windows in MASM. In 32 bit Windows, MASM (ML.EXE) produces the identical COFF (common object file format) to Microsoft Visual C (CL.EXE) so object modules written in either MASM or Visual C are interchangable. With MASM you have the choice of writing an object module in Microsoft C and using it with a MASM application just as you can write an object module in MASM and use it with Visual C. The difference with MASM is it is powerful enough to use a C compiler as an accessory to assembler programming.

5. MASM modifies your code when it assembles it. 

What you write is what you get with MASM. If you use some of the more common higher level capacities in MASM, you get the format it is written to create and this applies to the use of a stack frame for procedures and characteristics like jump length extension if a jump is too far away from the label it jumps to. In both instances you have options to change this, you can disable jump extensions if you want to and specify the jump range with SHORT or NEAR. With a procedure where you don't want a stack frame, you use a standard MASM syntax to turn the stack frame off and re-enable it after the procedure is finished. This technique is commonly used when writing reusable code for libraries where an extra register is required or where the stack overhead may slightly slow down the procedure.

6. MASM code is too complex for a beginner to learn. 

This is another myth from people trying to support other assemblers that don't have the code parsing power of MASM. MASM can be used to write from very simple code to extremely complex code. The difference is that it is powerful enough to do both without the ugly and complicated syntax of some of the other assemblers around that don't have the parsing power that of MASM. Differing from some of the less powerful assemblers, MASM uses the historical Intel notation when it uses keywords like OFFSET as this correctly distinguishes between a fixed address within an executable image and a stack variable which is created at run time when a procedure is called. When MASM requires operators like BYTE PTR, it is to distinguish between ambiguous notation forms where the size of the data cannot be determined any other way.

7. MASM is really a compiler because it has high level code. 

MASM is capable of writing many normal high level constructions like structures, unions, pointers and high level style procedures that have both size of parameter checking and parameter count checking but the difference again is that it is powerful enough to do this where many of the others are not. While you can write unreliable and impossible to debug code like some other assemblers must do, with MASM you have the choice to write highly reliable code that is subject to type checking. 

The real problem is that such capacities are technically hard to write into an assembler and while some of the authors of other assemblers are very higly skilled programmers, an individual does not have the resources, duration or capacity of a large software corporation that has developed and maintained MASM over just over 30 years.