home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Source Code 1992 March
/
Source_Code_CD-ROM_Walnut_Creek_March_1992.iso
/
msdos
/
asmutl
/
usoftpd.arc
/
MIXED.DOC
< prev
next >
Wrap
Text File
|
1987-07-31
|
9KB
|
273 lines
Mixed-Language Source Files
This directory contains mixed-language example programs and macros.
The following source files are the sample programs from Chapter 6,
"Assembly-to-High-Level Interface," of the Mixed-Language Programming
Guide:
BA.ASM Assembly module to be called from BASIC
CA.ASM Assembly module to be called from C
FA.ASM Assembly module to be called from FORTRAN
PA.ASM Assembly module to be called from Pascal
BAMAIN.BAS BASIC main program that calls assembly module
CAMAIN.C C main program that calls assembly module
FAMAIN.FOR FORTRAN main program that calls assembly module
PAMAIN.PAS Pascal main program that calls assembly module
In addition, the directory contains the following files:
MIXED.INC Macros for simplifying assembly routines intended
to be called from high-level languages.
POWER2.ASM Macro version of assembly module that can be called
from BASIC, C, FORTRAN, or Pascal.
Mixed-Language Macros
MIXED.INC contains macros for defining high-level-language routines.
It can create functions for Microsoft C, FORTRAN, or Pascal, and for
future versions of Microsoft BASIC. It can also create subprograms
for BASIC, subroutines for FORTRAN, or procedures for Pascal.
Note: Some BASIC examples use functions and the DECLARE
statement. These features are not available in versions of
Microsoft BASIC available at release time. They will work
if you rewrite functions as subprograms. Functions and
DECLARE statements will be supported in future versions of
Microsoft BASIC compilers.
The following macros are provided:
Macro Purpose
setModel Sets memory model passed from a DOS command line
hProc Initializes a procedure
hLocal Initializes local variables
hRet Returns from a procedure
hEndp Terminates a procedure
ifFP Assembles statement if the memory model uses far data
FP Provides ES override if the memory model uses far data
pLes Loads data (through ES for far data)
pLds Loads data (through DS for far data)
Other internal macros in MIXED.INC are used by these macros, but can
be ignored by the user.
Macro Syntax
The calling convention used in the macros depends on whether the
symbol "cLang" is defined. If "cLang" is defined, the C calling
convention is used. Otherwise, the calling convention used by
BASIC, FORTRAN, and Pascal is used.
Macro names and arguments are case insensitive. The macros and
their syntax are described below:
setModel
Sets the memory model to small, medium, compact, large, or huge.
This macro is an alternative to the .MODEL directive. It enables
you to pass a memory model from the MASM command line. For
example, you can use
setModel
as the first code in your source file and supply the memory model
with the /D option as shown below:
MASM /Dmodel=medium source;
hProc <name [NEAR|FAR]> [,<USES reglist>] [,arg[:type] [,arg[:type]]]...
Initializes a procedure by pushing BP and saving SP in BP. The
macro also handles the following tasks:
1. Declares the procedure name public in the format of the language
("doTask" is declared as "_doTask" for the C compiler).
2. Gives the procedure the type NEAR or FAR if specified, or the
default type for the memory model (NEAR for small and compact
models or FAR for medium, large, and huge models). If type is
specified, the name and type must be enclosed in angle brackets.
3. Saves and restores specified registers. The keyword USES must
be given as a parameter followed by the registers. USES and
the registers must be enclosed in angle brackets.
4. Assigns names and types to stack parameters. The type for
parameters can be BYTE, WORD, DWORD, FWORD, QWORD, TWORD, or
PTR. If no type is given, WORD is assumed. PTR type means
that the parameter is a pointer. It's size is variable
depending on the size of the memory model. Pointers are
assumed to point to data, so the size is NEAR for small and
medium models or FAR for compact, large, and huge models.
For example,
hProc <doTask FAR>, <USES si di>, count:BYTE, array:PTR, number
defines the FAR procedure "doTask" with byte parameter "count",
pointer paramter "array", and word parameter "number". The SI and
DI registers are saved.
hLocal var[:type] [,var[:type]]...
Saves space on the stack for local variables and assign them
variables names. For example,
hLocal work,temp:DWORD
allocates "work" as a temporary word variable and "temp" as a
temporary doubleword variable.
hRet
Returns from a procedure. SP is restored from BP if local variables
have been used. BP is popped. A RET instruction is given in
the format appropriate for the memory model and calling
convention.
hEndp
Ends a procedure. Note that a procedure may have several return
points, but only one end point.
ifFP statement
Assembles the statement if the memory model uses far data. This
macro can be used to push segment registers or take other
action that is only required for far data. For example,
ifFP push ds
pushes the DS register in compact, large, and huge memory
models, but has no effect in small and medium models.
FPoperand
Gives an ES override if the memory model uses far data. In
models that use near data, FP is null. For example,
mov ax,FP[bx]
assembles as
mov ax,es:[bx]
in compact, large, and huge memory models, but as
mov ax,[bx]
in small and medium models.
pLes register,address
pLds register,address
Loads a pointer from the specified address to the specified
register. If the memory model uses far data, the segment
portion of the address will be moved into ES or DS, depending
on the macro used. For example,
pLes bx,arg1
is assembled as
les bx,arg1
in compact, large, and huge memory models, but as
mov bx,arg1
in small and medium models.
Notes
The macros in MIXED.INC have several limitations:
1. The memory model must be set at the start of the source
file before any mixed-language macros are used. The model
can be set with the .MODEL directive or with the "setModel"
macro. For example, start with
INCLUDE mix.inc
.MODEL small
or with
model EQU <small> ; Or pass small from command line
INCLUDE mix.inc
setModel
The mixed-language macros only work with simplified segment
directives. You cannot use them with full segment definitions.
2. If the C calling convention is used, the symbol "cLang"
must be defined before the start of a procedure. For
example, define the symbol in the source file with the line
cLang = 1
or from the command line with the option
/DcLang
3. The macros do not automatically handle 80386 features such
as 32-bit pointers.
4. All limitations and techniques described the Mixed-Language
Programming Guide apply. For instance, you must save and
restore the DS, SS, DI, and SI registers if your module
modifies them. Return values should be passed back by
placing them in AL, AX, or DX:AX before returning.
5. FORTRAN and Pascal require that the address for certain
return values (such as real numbers or arrays) be passed as
the last argument. The macros do not handle this situation,
so the programmer must handle it specifically. An example
is shown below:
hProc FuncFORTRAN,Arg1,Arg2,RetPoint
.
.
.
mov RetPoint,bx ; Assume BX contains a pointer
; to return value
Return
6. The convenience of using the macros in MIXED.INC has a cost
in slower assembly time.
Examples
The file POWER2.ASM contains a sample assembly module that is
equivalent to the sample modules in BA.ASM, CA.ASM, FA.ASM, and
PA.ASM. POWER2.ASM uses the macros in MIXED.INC and can be
assembled from the command-line for any language or memory
model. The module can be linked with the high-level-language
modules created from BAMAIN.BAS, CAMAIN.C, FAMAIN.FOR, or
PAMAIN.PAS. The command lines for default memory models are
shown below for each language:
BASIC - CodeView symbolic data and medium model
MASM /ZI /Dmodel=medium power2;
C - Case sensitive, CodeView symbolic data, small model, and "cLang" defined
MASM /Mx /Zi /Dmodel=small /DcLang power2;
FORTRAN - CodeView symbolic data and large model
MASM /ZI /Dmodel=large power2;
Pascal - CodeView symbolic data and large model
MASM /ZI /Dmodel=large power2;