HOWTO: Pass a short from C to MASM by Value & Returning short

Last reviewed: September 30, 1997
Article ID: Q104617

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, versions 1.0, 1.5
  • Microsoft Visual C++ 32-bit Edition, versions 1.0, 2.0, 4.0, 5.0

SUMMARY

The sample code below demonstrates how to pass a short from a program written in Microsoft C to a procedure written with the Microsoft Macro Assembler (MASM). The MASM function also returns a short 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

MORE INFORMATION

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

   short MasmSub(short);

   #ifdef __cplusplus
   }
   #endif

   main ()
   {
      short var = 1;
      printf ("%d\n", var);
      printf ("%d", 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, \
      sVar:WORD

      mov ax, sVar     ; Load the short into AX.
      add ax, 32766    ; Because the function returns a short (a 2-byte
      ret              ; value), C will get the return value from AX.
   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, \
      sVar:WORD

      mov ax, sVar     ; Load the short into AX.
      add ax, 32766    ; Because the function returns a short (a 2-byte
      ret              ; value), C will get the return value from AX.
   MasmSub ENDP
   END

The following is the output of the program:

  1
  32767


Additional query words: mixed language
Keywords : CLngIss MASMLngIss kbcode kbfasttip
Version : MS-DOS:6.0,6.0a,6.0ax,7.0; OS/2:6.0,6.0a; WINDOWS:1.0,1.5; WINDOWS NT:1.0,2.0,4.0,5.0
Platform : MS-DOS NT OS/2 WINDOWS
Issue type : kbhowto


THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY.

Last reviewed: September 30, 1997
© 1998 Microsoft Corporation. All rights reserved. Terms of Use.