Microsoft KB Archive/104618

From BetaArchive Wiki
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Article ID: 104618

Article Last Modified on 4/24/2006



APPLIES TO

  • Microsoft Visual C++ 1.0 Professional Edition
  • Microsoft Visual C++ 1.5 Professional Edition
  • Microsoft Visual C++ 2.0 Professional Edition
  • Microsoft Visual C++ 2.1
  • Microsoft Visual C++ 4.0 Standard Edition
  • Microsoft Visual C++ 5.0 Enterprise Edition
  • Microsoft Visual C++ 6.0 Enterprise Edition
  • Microsoft Visual C++ 5.0 Professional Edition
  • Microsoft Visual C++ 6.0 Professional Edition
  • Microsoft Visual C++ 6.0 Standard Edition



This article was previously published under Q104618


SUMMARY

The sample code below demonstrates how to pass a char from a program written in Microsoft C to a procedure written with the Microsoft Macro Assembler (MASM). The MASM function also returns a char to the C program.

Registers are used to return values of simple data types. For 16-bit code, such as an MS-DOS program, use the following conventions for returning data to a C program:

char                   AL
short, int, near *     AX
long, far *            DX:  High order portion (segment)
                       AX:  Low order portion (offset)
                

For 32-bit code, such as a Windows NT program, use the following conventions for returning data to a C program:

char                   AL
short                  AX
long, int, *           EAX
                

The samples below include one C file and two different assembly files. The two assembly files demonstrate how to pass a variable in small 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++ 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

#include <stdio.h>

#ifdef __cplusplus
extern "C" {
#endif

char MasmSub (char);

#ifdef __cplusplus
}
#endif

main ()
{
   char var = 'a';
   printf ("%c\n", var);
   printf ("%c", MasmSub(var));
}
                

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
.286
.CODE

MasmSub PROC, \ 
   cVar:BYTE

   mov al, cVar     ; Load the char into AL.
   add al, 25       ; Because the function returns a char (a 1-byte
   ret              ; value), C will get the return value from AL.
MasmSub ENDP
END
                

Sample Code for Windows NT Flat Model Version

; Filename: MASMSUB.ASM
; Assemble options needed for ML: /c /Cx /coff

.386
.MODEL flat, C
.CODE

MasmSub PROC, \ 
   cVar:BYTE

   mov al, cVar     ; Load the char into AL.
   add al, 25       ; Because the function returns a char (a 1-byte
   ret              ; value), C will get the return value from AL.
MasmSub ENDP
END
                

The following is the output of the program:

  a
  z
                

Keywords: kbhowtomaster kblangc kbcode KB104618