HOWTO: Pass Common C Types to MASM by Reference
ID: Q103725
|
The information in this article applies to:
-
Microsoft C for MS-DOS, versions 5.1, 5.1a, 6.0, 6.0a, 6.0ax
-
Microsoft C for OS/2, versions 5.1, 6.0, 6.0a
-
Microsoft C/C++ for MS-DOS, version 7.0
-
Microsoft Visual C++ for Windows, 16-bit edition, versions 1.0, 1.5
-
Microsoft Visual C++, 32-bit Editions, versions 1.0, 2.0, 4.0, 5.0, 6.0
SUMMARY
The sample code below demonstrates how to pass variables of type char,
short, and long from a Microsoft C program to a Microsoft Macro
Assembler (MASM) program by reference.
MORE INFORMATION
The following sample includes one C file and three different assembly
files. The three assembly files demonstrate how to pass variables by
reference in small and large model for MS-DOS and in flat model for
Windows NT. Link only the appropriate assembly module to the C module.
Note that MASM 6.1 or later and the C/C++ version 8.0 32-bit compiler
that ships with Visual C++, 32-bit Edition, are required to build the
flat model Windows NT version.
Sample Code
// Filename: CMAIN.C
// Compile options needed: /c (and /AL for large model)
#include <stdio.h>
extern void MasmSub (char *, short *, long *);
char charvar = 'a';
short shortvar = 1;
long longvar = 32768L;
void main (void)
{
printf ("%c %d %ld\n", charvar, shortvar, longvar);
MasmSub (&charvar, &shortvar, &longvar);
printf ("%c %d %ld", charvar, shortvar, longvar);
}
Sample Code for MS-DOS Small Model Version
; Filename: MASMSUB.ASM
; Assemble options needed for MASM: /MX
; Assemble options needed for ML: /c /Cx
.MODEL small, C ;.MODEL ... C tells the assembler that
.286 ; parameters are pushed from right to left.
.CODE
MasmSub PROC uses si, \
pchar:PTR, \
pshort:PTR, \
plong:PTR
mov si, pchar ;Load SI with the address of the char variable.
mov BYTE PTR [si], "z"
mov si, pshort ;Load SI with the address of the short variable.
add WORD PTR [si], 9
mov si, plong ;Load SI with the address of the long variable.
add WORD PTR [si], 1 ;Increment the low word of the long variable
;by 1.
adc WORD PTR [si+2],0 ;Increment the high word.
ret
MasmSub ENDP
END
Sample Code for MS-DOS Large Model Version
; Filename: MASMSUB.ASM
; Assemble options needed for MASM: /MX
; Assemble options needed for ML: /c /Cx
.MODEL large, C ;.MODEL ... C tells the assembler that
.286 ; parameters are pushed from right to left.
.CODE
MasmSub PROC uses es si, \
pchar:PTR, \
pshort:PTR, \
plong:PTR
les si, pchar ;Load ES:SI with the address of the char variable.
mov BYTE PTR es:[si], "z"
les si, pshort ;Load ES:SI with the address of the short
;variable.
add WORD PTR es:[si], 9
les si, plong ;Load ES:SI with the address of the long variable.
add WORD PTR [si], 1 ;Increment the low word of the long variable
;by 1.
adc WORD PTR [si+2],0 ;Increment the high word.
ret
MasmSub ENDP
END
Sample Code for Windows NT Flat Model Version
; Filename: MASMSUB.ASM
; Assemble options needed for ML: /c /Cx /coff
.386 ;.MODEL ... C tells the assembler that
.MODEL flat, C ; parameters are pushed from right to left.
.CODE
MasmSub PROC uses esi, \
pchar:PTR, \
pshort:PTR, \
plong:PTR
mov esi, pchar ;Load ESI with the address of the char variable.
mov BYTE PTR [esi], "z"
mov esi, pshort ;Load ESI with the address of the short
;variable.
add WORD PTR [esi], 9
mov esi, plong ;Load ESI with the address of the long variable.
inc DWORD PTR [esi] ;Increment the long variable by 1.
ret
MasmSub ENDP
END
The following is the output of the program:
a 1 32768
z 10 32769
Additional query words:
8.00 9.00 mixed language
Keywords : kbcode kbLangC kbVC100 kbVC150 kbVC200 kbVC400 kbVC500 kbVC600 MASMLngIss
Version : MS-DOS:7.0; WINDOWS:1.0,1.5; winnt:1.0,2.0,4.0,5.0
Platform : MS-DOS WINDOWS winnt
Issue type : kbhowto