0% found this document useful (0 votes)
21 views

00 Contents

This document provides an overview and table of contents for a book about using MASM assembly language. It outlines new features in MASM 6.1, conventions used in the book, and how to get help. The table of contents previews chapters on understanding global concepts in assembly language, organizing code and data into segments, using addresses and pointers, and defining simple data types.

Uploaded by

darwinvargas2011
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
21 views

00 Contents

This document provides an overview and table of contents for a book about using MASM assembly language. It outlines new features in MASM 6.1, conventions used in the book, and how to get help. The table of contents previews chapters on understanding global concepts in assembly language, organizing code and data into segments, using addresses and pointers, and defining simple data types.

Uploaded by

darwinvargas2011
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 9

iii

Contents
Introduction. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xiii
New and Extended Features in MASM 6.1 . . . . . . . . . . . . . . . . . . . . . . . . xiii
MASM Features New Since Version 5.1 . . . . . . . . . . . . . . . . . . . . . . . . xiv
MASM Features New Since Version 6.0 . . . . . . . . . . . . . . . . . . . . . . . . xv
ML and MASM Command Lines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xvi
Compatibility with Earlier Versions of MASM . . . . . . . . . . . . . . . . . . . . xvi
A Word About Instruction Timings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xvii
Books for Further Reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xviii
Document Conventions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xix
Getting Assistance and Reporting Problems . . . . . . . . . . . . . . . . . . . . . . . . xx

Chapter 1 Understanding Global Concepts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1


The Processing Environment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
8086-Based Processors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
Operating Systems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
Segmented Architecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
Segment Protection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Segmented Addressing. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Segment Arithmetic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Language Components of MASM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
Reserved Words . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
Identifiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
Predefined Symbols . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
Integer Constants and Constant Expressions . . . . . . . . . . . . . . . . . . . . . 11
Operators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
Data Types. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Registers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
Statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
The Assembly Process . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
Generating and Running Executable Programs . . . . . . . . . . . . . . . . . . . . 23
Using the OPTION Directive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
Conditional Directives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28

Chapter 2 Organizing Segments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31


Physical Memory Segments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
Logical Segments. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
Using Simplified Segment Directives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

Filename: LMAPGTOC.DOC Project:


Template: FRONTA1.DOT Author: Don Hayward Last Saved By: Ruth L Silverio
Revision #: 18 Page: 3 of 1 Printed: 10/02/00 04:19 PM
iv Contents

Defining Basic Attributes with .MODEL . . . . . . . . . . . . . . . . . . . . . . . . 34


Specifying a Processor and Coprocessor . . . . . . . . . . . . . . . . . . . . . . . . 38
Creating a Stack. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
Creating Data Segments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
Creating Code Segments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
Starting and Ending Code with .STARTUP and .EXIT . . . . . . . . . . . . . . 41
Using Full Segment Definitions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
Defining Segments with the SEGMENT Directive. . . . . . . . . . . . . . . . . . 44
Controlling the Segment Order . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
Setting the ASSUME Directive for Segment Registers . . . . . . . . . . . . . . . 49
Defining Segment Groups . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51

Chapter 3 Using Addresses and Pointers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53


Programming Segmented Addresses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
Initializing Default Segment Registers. . . . . . . . . . . . . . . . . . . . . . . . . . . 53
Near and Far Addresses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
Operands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
Register Operands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
Immediate Operands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
Direct Memory Operands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
Indirect Memory Operands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
The Program Stack. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
Saving Operands on the Stack . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
Saving Flags on the Stack . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
Saving Registers on the Stack (80186–80486 Only). . . . . . . . . . . . . . . . . 74
Accessing Data with Pointers and Addresses . . . . . . . . . . . . . . . . . . . . . . . . 74
Defining Pointer Types with TYPEDEF . . . . . . . . . . . . . . . . . . . . . . . . 75
Defining Register Types with ASSUME . . . . . . . . . . . . . . . . . . . . . . . . . 77
Basic Pointer and Address Operations . . . . . . . . . . . . . . . . . . . . . . . . . . 78

Chapter 4 Defining and Using Simple Data Types . . . . . . . . . . . . . . . . . . . . . . . 85


Declaring Integer Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
Allocating Memory for Integer Variables . . . . . . . . . . . . . . . . . . . . . . . . 85
Data Initialization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
Working with Simple Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
Copying Data. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
Adding and Subtracting Integers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
Multiplying and Dividing Integers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
Manipulating Numbers at the Bit Level. . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
Logical Instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
Shifting and Rotating Bits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100

Filename: LMAPGTOC.DOC Project:


Template: FRONTA1.DOT Author: Don Hayward Last Saved By: Ruth L Silverio
Revision #: 18 Page: 4 of 2 Printed: 10/02/00 04:19 PM
Contents v

Multiplying and Dividing with Shift Instructions . . . . . . . . . . . . . . . . . . 102

Chapter 5 Defining and Using Complex Data Types. . . . . . . . . . . . . . . . . . . . . 105


Arrays and Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
Declaring and Referencing Arrays. . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
Declaring and Initializing Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
Processing Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
Structures and Unions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
Declaring Structure and Union Types . . . . . . . . . . . . . . . . . . . . . . . . . 118
Defining Structure and Union Variables. . . . . . . . . . . . . . . . . . . . . . . . 121
Referencing Structures, Unions, and Fields . . . . . . . . . . . . . . . . . . . . . 126
Nested Structures and Unions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
Records . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
Declaring Record Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
Defining Record Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
Record Operators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133

Chapter 6 Using Floating-Point and Binary Coded Decimal Numbers . . . . . . . 135


Using Floating-Point Numbers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
Declaring Floating-Point Variables and Constants . . . . . . . . . . . . . . . . . 136
Storing Numbers in Floating-Point Format. . . . . . . . . . . . . . . . . . . . . . 138
Using a Math Coprocessor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
Coprocessor Architecture. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
Instruction and Operand Formats . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
Coordinating Memory Access. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
Using Coprocessor Instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
Using An Emulator Library. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
Using Binary Coded Decimal Numbers . . . . . . . . . . . . . . . . . . . . . . . . . . 156
Defining BCD Constants and Variables . . . . . . . . . . . . . . . . . . . . . . . . 157
BCD Calculations on a Coprocessor . . . . . . . . . . . . . . . . . . . . . . . . . . 157
BCD Calculations on the Main Processor . . . . . . . . . . . . . . . . . . . . . . 158

Chapter 7 Controlling Program Flow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161


Jumps. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
Unconditional Jumps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
Conditional Jumps. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
Loops . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172
Loop-Generating Directives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
Writing Loop Conditions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
Procedures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180
Defining Procedures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180

Filename: LMAPGTOC.DOC Project:


Template: FRONTA1.DOT Author: Don Hayward Last Saved By: Ruth L Silverio
Revision #: 18 Page: 5 of 3 Printed: 10/02/00 04:19 PM
vi Contents

Passing Arguments on the Stack . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182


Declaring Parameters with the PROC Directive . . . . . . . . . . . . . . . . . . 184
Using Local Variables. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188
Creating Local Variables Automatically . . . . . . . . . . . . . . . . . . . . . . . . 190
Declaring Procedure Prototypes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
Calling Procedures with INVOKE . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
Generating Prologue and Epilogue Code. . . . . . . . . . . . . . . . . . . . . . . . 198
MS-DOS Interrupts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204
Calling MS-DOS and ROM-BIOS Interrupts . . . . . . . . . . . . . . . . . . . . 204
Replacing an Interrupt Routine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206

Chapter 8 Sharing Data and Procedures Among Modules and Libraries . . . . . 211
Selecting Data-Sharing Methods. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
Sharing Symbols with Include Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212
Organizing Modules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212
Declaring Symbols Public and External . . . . . . . . . . . . . . . . . . . . . . . . 214
Positioning External Declarations. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228
Using Alternatives to Include Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219
PUBLIC and EXTERN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220
Other Alternatives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221
Developing Libraries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221
Associating Libraries with Modules . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
Using EXTERN with Library Routines . . . . . . . . . . . . . . . . . . . . . . . . 223

Chapter 9 Using Macros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225


Text Macros. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226
Macro Procedures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226
Creating Macro Procedures. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227
Passing Arguments to Macros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228
Specifying Required and Default Parameters . . . . . . . . . . . . . . . . . . . . 229
Defining Local Symbols in Macros . . . . . . . . . . . . . . . . . . . . . . . . . . . 232
Assembly-Time Variables and Macro Operators . . . . . . . . . . . . . . . . . . . . 233
Text Delimiters and the Literal-Character Operator . . . . . . . . . . . . . . . . 234
Expansion Operator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235
Substitution Operator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
Defining Repeat Blocks with Loop Directives . . . . . . . . . . . . . . . . . . . . . . 239
REPEAT Loops. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240
WHILE Loops. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
FOR Loops and Variable-Length Parameters . . . . . . . . . . . . . . . . . . . . 242
FORC Loops . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244
String Directives and Predefined Functions . . . . . . . . . . . . . . . . . . . . . . . . 245

Filename: LMAPGTOC.DOC Project:


Template: FRONTA1.DOT Author: Don Hayward Last Saved By: Ruth L Silverio
Revision #: 18 Page: 6 of 4 Printed: 10/02/00 04:19 PM
Contents vii

Returning Values with Macro Functions. . . . . . . . . . . . . . . . . . . . . . . . . . 248


Returning Values with EXITM. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248
Using Macro Functions with Variable-Length Parameter Lists . . . . . . . . 249
Expansion Operator in Macro Functions . . . . . . . . . . . . . . . . . . . . . . . 251
Advanced Macro Techniques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251
Defining Macros within Macros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251
Testing for Argument Type and Environment . . . . . . . . . . . . . . . . . . . 252
Using Recursive Macros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255

Chapter 10 Writing a Dynamic-Link Library For Windows . . . . . . . . . . . . . . . . 257


Overview of DLLs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257
Loading a DLL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258
Building a DLL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260
DLL Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261
DLL Data. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265
DLL Stack . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265
DLL Extension Names . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266
Example of a DLL: SYSINFO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
Entry Routine for SYSINFO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268
Expanding SYSINFO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270

Chapter 11 Writing Memory-Resident Software . . . . . . . . . . . . . . . . . . . . . . . . 273


Terminate-and-Stay-Resident Programs. . . . . . . . . . . . . . . . . . . . . . . . . . 273
Structure of a TSR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274
Passive TSRs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274
Active TSRs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275
Interrupt Handlers in Active TSRs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275
Auditing Hardware Events for TSR Requests . . . . . . . . . . . . . . . . . . . 275
Monitoring System Status . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277
Determining Whether to Invoke the TSR . . . . . . . . . . . . . . . . . . . . . . 279
Example of a Simple TSR: ALARM . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279
Using MS-DOS in Active TSRs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285
Understanding MS-DOS Stacks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285
Determining MS-DOS Activity. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285
Interrupting MS-DOS Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286
Monitoring the Critical Error Flag . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287
Preventing Interference . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288
Trapping Errors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288
Preserving an Existing Condition. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289
Preserving Existing Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290

Filename: LMAPGTOC.DOC Project:


Template: FRONTA1.DOT Author: Don Hayward Last Saved By: Ruth L Silverio
Revision #: 18 Page: 7 of 5 Printed: 10/02/00 04:19 PM
viii Contents

Communicating Through the Multiplex Interrupt . . . . . . . . . . . . . . . . . . . . 290


The Multiplex Handler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291
Using the Multiplex Interrupt Under MS-DOS Version 2.x. . . . . . . . . . . 292
Deinstalling a TSR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292
Example of an Advanced TSR: SNAP . . . . . . . . . . . . . . . . . . . . . . . . . . . 293
Building SNAP.EXE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294
Outline of SNAP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295

Chapter 12 Mixed-Language Programming . . . . . . . . . . . . . . . . . . . . . . . . . . . 307


Naming and Calling Conventions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 308
Naming Conventions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309
The C Calling Convention. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309
The Pascal Calling Convention . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310
The STDCALL and SYSCALL Calling Conventions. . . . . . . . . . . . . . . 311
Writing an Assembly Procedure For a Mixed-Language Program . . . . . . . . 312
The MASM/High-Level–Language Interface . . . . . . . . . . . . . . . . . . . . . . . 313
The C/MASM Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315
The C++/MASM Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 322
The FORTRAN/MASM Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323
The Basic/MASM Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328

Chapter 13 Writing 32-Bit Applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335


32-Bit Memory Addressing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335
MASM Directives for 32-Bit Programming . . . . . . . . . . . . . . . . . . . . . . . . 336
Sample Program . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337

Appendixes
Appendix A Differences Between MASM 6.1 and 5.1. . . . . . . . . . . . . . . . . . . . 341
New Features of Version 6.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 342
The Assembler, Environment, and Utilities . . . . . . . . . . . . . . . . . . . . . . 342
Segment Management . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343
Data Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344
Procedures, Loops, and Jumps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347
Simplifying Multiple-Module Projects . . . . . . . . . . . . . . . . . . . . . . . . . 348
Expanded State Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349
New Processor Instructions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 350
Renamed Directives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 350
Macro Enhancements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 351
MASM 6.1 Programming Practices . . . . . . . . . . . . . . . . . . . . . . . . . . . 352
Compatibility Between MASM 5.1 and 6.1. . . . . . . . . . . . . . . . . . . . . . . . 352

Filename: LMAPGTOC.DOC Project:


Template: FRONTA1.DOT Author: Don Hayward Last Saved By: Ruth L Silverio
Revision #: 18 Page: 8 of 6 Printed: 10/02/00 04:19 PM
Contents ix

Rewriting Code for Compatibility . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353


Using the OPTION Directive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 361
Changes to Instruction Encodings . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377

Appendix B BNF Grammar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 379

Appendix Generating and Reading Assembly Listings. . . . . . . . . . . . . . . . . . 397


Generating Listing Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 397
Precedence of Command-Line Options and Listing Directives. . . . . . . . 399
Reading the Listing File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 399
Generated Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 399
Error Messages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 400
Symbols and Abbreviations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 400
Reading Tables in a Listing File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 404

Appendix D MASM Reserved Words . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 407


Operands and Symbols. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 407
Special Operands for the 80386/486 . . . . . . . . . . . . . . . . . . . . . . . . . . 409
Predefined Symbols . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 409
Registers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 409
Operators and Directives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 410
Processor Instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 412
8086/8088 Processor Instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . . 412
80186 Processor Instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 413
80286 Processor Instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 413
80286 and 80386 Privileged-Mode Instructions . . . . . . . . . . . . . . . . . . 413
80386 Processor Instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 413
80486 Processor Instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 414
Instruction Prefixes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 414
Coprocessor Instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 414
8087 Coprocessor Instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 414
80287 Privileged-Mode Instruction . . . . . . . . . . . . . . . . . . . . . . . . . . . 415
80387 Instructions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415

Appendix E Default Segment Names . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 417

Glossary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 421

Index. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 435

Filename: LMAPGTOC.DOC Project:


Template: FRONTA1.DOT Author: Don Hayward Last Saved By: Ruth L Silverio
Revision #: 18 Page: 9 of 7 Printed: 10/02/00 04:19 PM
x Contents

Figures and Tables


Figures
1.1 Segment Allocation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.2 Calculating Physical Addresses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.3 Registers for 8088-80286 Processors . . . . . . . . . . . . . . . . . . . . . . . . . . 17
1.4 Extended Registers for the 80386/486 Processors . . . . . . . . . . . . . . . . . 18
1.5 Flags for 8088-80486 Processors. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
3.1 Stack Status Before and After Pushes and Pops . . . . . . . . . . . . . . . . . . 72
4.1 Integer Formats . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
4.2 Shifts and Rotates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
6.1 Encoding for Real Numbers in IEEE Format . . . . . . . . . . . . . . . . . . . 138
6.2 Coprocessor Data Registers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
6.3 Status of the Register Stack. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
6.4 Status of the Register Stack and Memory Locations . . . . . . . . . . . . . . 143
6.5 Status of the Previously Initialized Register Stack . . . . . . . . . . . . . . . . 144
6.6 Status of the Already Initialized Register Stack . . . . . . . . . . . . . . . . . . 144
6.7 Status of the Register Stack: Main Memory and Coprocessor. . . . . . . . 148
6.8 Coprocessor Control Registers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
6.9 Coprocessor and Processor Control Flags . . . . . . . . . . . . . . . . . . . . . . 155
7.1 Program Arguments on the Stack . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
7.2 Local Variables on the Stack . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
7.3 Operation of Interrupts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
8.1 Using EXTERNDEF for Variables. . . . . . . . . . . . . . . . . . . . . . . . . . . 215
8.2 Using PROTO and INVOKE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217
8.3 Using PUBLIC and EXTERN. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221
11.1 Time Line of Interaction Between Interrupt Handlers
for a Typical TSR. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278
11.2 Flowchart for SNAP.EXE: Installation Phase . . . . . . . . . . . . . . . . . . 296
11.3 Flowchart for SNAP.EXE Resident Phase . . . . . . . . . . . . . . . . . . . . 297
11.4 Flowchart for SNAP.EXE Deinstallation Phase. . . . . . . . . . . . . . . . . 298
12.1 C String Format . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316
12.2 C Stack Frame . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320
12.3 FORTRAN String Frame . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324
12.4 FORTRAN Stack Frame. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327
12.5 Basic String Descriptor Format . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330
12.6 Basic Stack Frame . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333
B.1 BNF Definition of the TYPEDEF Directive . . . . . . . . . . . . . . . . . . . . 380

Filename: LMAPGTOC.DOC Project:


Template: FRONTA1.DOT Author: Don Hayward Last Saved By: Ruth L Silverio
Revision #: 18 Page: 10 of 8 Printed: 10/02/00 04:19 PM
Contents xi

Tables
1.1 8086 Family of Processors. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.2 The MS-DOS and Windows Operating Systems Compared . . . . . . . . . . 4
1.3 Operator Precedence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.1 Attributes of Memory Models . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
3.1 Indirect Addressing with 16-Bit Registers . . . . . . . . . . . . . . . . . . . . . . 68
4.1 Division Operations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
5.1 Requirements for String Instructions . . . . . . . . . . . . . . . . . . . . . . . . . 112
6.1 Ranges of Floating-Point Variables . . . . . . . . . . . . . . . . . . . . . . . . . . 136
6.2 Coprocessor Operand Formats . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
6.3 Control-Flag Settings After Comparison or Test . . . . . . . . . . . . . . . . . 151
7.1 Conditional Jumps Based on Comparisons of Two Values . . . . . . . . . 167
9.1 MASM Macro Operators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234
11.1 MS-DOS Internal Stacks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286
12.1 Naming and Calling Conventions . . . . . . . . . . . . . . . . . . . . . . . . . . 309
12.2 Register Conventions for Simple Return Values . . . . . . . . . . . . . . . . 317
A.1 Requirements for String Instructions. . . . . . . . . . . . . . . . . . . . . . . . . 353
C.1 Options for Generating or Modifying Listing Files . . . . . . . . . . . . . . . 398
C.2 Symbols and Abbreviations in Listings . . . . . . . . . . . . . . . . . . . . . . . 400
C.3 Symbols in Timing Column . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 401

Filename: LMAPGTOC.DOC Project:


Template: FRONTA1.DOT Author: Don Hayward Last Saved By: Ruth L Silverio
Revision #: 18 Page: 11 of 9 Printed: 10/02/00 04:19 PM

You might also like