Download masm

Survey
yes no Was this document useful for you?
   Thank you for your participation!

* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project

Document related concepts
no text concepts found
Transcript
Invoking MASM and LINK
Assembling, Linking, and Debugging
By now, we have seen that it's fairly easy to assemble and run short programs with Debug.
You should have read the handout on Writing Assembly Language Programs We will now
begin using an assembler; a utility program that converts a source program into an object
file, and a linker; a program that converts object files into executable programs. We woll
also use a loader when we invoke the command at the MS-DOS prompt.
One major advantage to using an assembler is that source programs can be more easily
modified with a text editor than with DEBUG. Another is that you can use symbolic names
for variables, rather than hard-coded numeric addresses. The linker has one primary
advantage- programs can take advantage of existing libraries full of useful subroutines; the
subroutines are "attached" to our programs by the linker.
Assembly and Linking is A Two-Stage Process
FIGURE 1
Figure 1 shows the stages a program goes through from source code creation through the
creation of the executable file. There are a number of individual steps involved.

The programmer uses a text editor to create the source file in ASCII text. The file is
saved with an ASM extension as an ASCII text file.

Invoke MASM to create an object file (OBJ) and using options, a list (LST) file.The
assembler program reads the source file and produces an object file, a machinelanguage translation of the program. The object file may contain calls to subroutines
in an external link library.

Invoke the linker. The linker then copies the needed subroutines from the link
library into the object file, creates a special header record at the beginning of the
program, and produces an executable program. If other OBJ files are linked, they are
merged together. The OBJ files may be created with the assembler by assembling it
separately, or with a high level language compiler.

The linker created an EXE or COM file, which may be executed from the command
prompt by typing the name of the program. When we run the program by typing its
name on the DOS command line, the DOS loader decodes the header record of the
executable program and loads it into memory. The CPU begins executing the
program.
The assembler produces an optional listing file (filename.lst) when we use the /Fl option.
This is a copy of the program's source file (suitable for printing) with line numbers and
translated machine code. If there are any errors or warnings, the assembler places an
appropriate error message on the line after the instruction. It would look like this:
mov ax,bl
error.asm(10) : error A2070: invalid instruction operands
The reason for the error is we are trying to copy byte size data (8-bits of data from the BL
register) into a word size register (the 16-bit AX register). Remember, the destination and
source operands must have the same boundary (data) size.
Page 1
Invoking MASM and LINK
The linker produces an optional map file, which contains information about the program's
code, data, and stack segments. A link library is a file containing subroutines that are
already compiled into machine language. Any procedures called by your program are
copied into the executable program during the link step.
The primary file produced by the assembly step is hello.obj. The assembler distinguishes
between error messages and warning messages. A program with warning messages will still
assemble, but the object file may have errors. In general, it is best to fix such errors before
linking the program.
Syntax Errors
We were fortunate to have not made any mistakes when writing this program. But if we
had, the assembler would have displayed the line with the mistake, along with an
explanation. For example, value! was incorrectly spelled as vaule!
Microsoft Assembler (MASM)
The Microsoft Assembler package contains the ML.EXE program, which assembles and
links one or more assembly language source files, producing an object file (extension .obj)
and an executable file (.exe). The basic syntax is:
ML options filename.asm
The switch or option is case sensitive while the rest of the statement is not. For example, the
following command assembles and links hello.asm {with CodeView debugging
information), producing hello.obj and hello.exe:
ml /Zi hello.asm
The following assembles and links hello.asm producing a listing file called hello.lst as well
as hello.obj, hello.exe:
ml /Fl hello.asm
The following assembles, links, and produces a map file called hello.map during the link
step. It still produces hello.obj and hello.exe:
ml /Fm hello.asm
You can use as many options in the command line as you wish.
With MASM 6.11, the ML command assemble and link a .ASM file This invokes both the
assembler and linker in a single command line.
ml hello.asm
It produces a .OBJ file and a .EXE file
Option /Zi produces debugging info for CV
Option /Fl produces a source listing
Option /Fm produces a map file
To produce all of these, type (with spaces)
ml /Zi /Fl /Fm hello.asm
Examining hello.lst
The beginning of the CODE segment in the lst file looks like the following:
0000
.CODE
.startup
; Now we should load the Data Segment register
0017 B8 ---- R
mov ax,@data
001A 8E D8
mov ds,ax
Page 2
Invoking MASM and LINK
The R suffix associated with the address indicates that reference, in this case @DATA, is
relocatable (resolved at loading time by the OS).
Examining hello.map
The map file is generated when we assemble a program with the /Fm command. The map
file contains information about the beginning and end addresses and size of all the segments
in our program. Hello/map looks like the following:
Start
00000H
0002EH
00040H
Stop
0002CH
0003CH
0203FH
Origin
0002:0
Length
0002DH
0000FH
02000H
Name
_TEXT
_DATA
STACK
Class
CODE
DATA
STACK
Group
DGROUP
Address
Publics by Name
Address
Publics by Value
Program entry point at 0000:0000
With the .model small directive, MASM aligns the segments in memory in the following
way:
the stack segment is align at the next available paragraph boundary (ie: at a physical
address divisible by 10h)
the code and data segments are aligned at the next available word boundary (ie: at a
physical address divisible by 2)
The (relative) starting physical address of the segments are found in the hello.map file
By default MASM only enables the assembly of the 8086 instructions. If we wish to use the
more powerful 80386 instruction set (to move data as doublewords or use the registers for
32-bit operands) we need to enable these instructions by invoking the .386 directive. TO
do this, place this directive just after .model directive like this:
.model small
.386
The offset address of the first data is generally not 0 if the data segment is loaded on a word
boundary If the code part of hello.asm takes 11h bytes and starts at 30000h. The first data
will start at 30012h and DS will contain 3001h.
.data
message db "Hello, world!",0dh,0ah,'$’
A program that accesses data or libraries that are defined in another file must use the
EXTRN directive. A link library is a file containing assembled or complied procedures.
elec242.lib contains procedures for performing I/O and string-to-number conversion. You
will find this file on the hard drives in ATC 105, or you may download the file from the
ELEC242 web site. For example, we wish to use a procedure defined in ELEC242.LIB, the
program that calls that procedure must have the following statement in the .code section:
.code
extrn Readint:proc, Writeint_signed:proc
In the above line, the procedures:
Readint : reads a signed decimal string from the keyboard and stores the
corresponding 16-bit signed number into AX
Page 3
Invoking MASM and LINK
Writeint_signed : displays the signed decimal string representing the signed
number in AX
To use these procedures, include the extern directive in an asm file claaled filename.asm,
assemble the file using the command line
ml /Fl irvine16.lib filename.asm
I have created a batch file called m.bat. The file contains the following command line:
ml /Fl irvine16.lib %1.asm
To assemble and link your program, enter the command
m filename
where filename is the name of the file. Both m.bat and irvine16.lib must be in the same
directory as the asm files. You may use this command line even if we do not use any of the
library functions.
Also make sure to modify the path statement in AUTOEXEC.BAT. This file is in the root
directory on drive C: Open AUTOEXEC.BAT in a text editor. Move to the end of the
PATH statement and add the following:
; c:\masm611\bin;
and reboot.
For externally defined variables we use either byte, word or dword as follows
extrn byteVar:byte, wordVar:word
Page 4