KnowledgeBase Archive

An Archive of Early Microsoft KnowledgeBase Articles

View on GitHub

Q63039: Passing a Constant from C to Assembly with a Header File

Article: Q63039
Product(s): See article
Version(s): 5.10 5.10a
Operating System(s): MS-DOS
Keyword(s): ENDUSER | | mspl13_masm
Last Modified: 3-JUL-1990

The example below illustrates how to pass a constant value between C
and Assembly without passing the constant as a parameter. This
information also applies to Microsoft C for OS/2 versions 5.10 and
6.00.

The constant in C is given the type identifier "const" and placed in a
header file. This makes the constant public. Within the assembly
module, the variable is declared as "extrn" in two places.

At the top of the assembly module it indicates to the assembler that
the variable is declared externally. It then needs to be declared
within the procedure. This allows the language translator (assembler)
to provide the right correction record for the linker to resolve.

The following code illustrates the above:

#include <stdio.h>
#include "test.h"     /*Header file with constant declared*/

extern void testor();

main()

{

 printf("Selec is initially %xH\n", selec);

 testor();

 printf("Selec is modified to %xH\n", selec);

 }

The contents of the header file "test.h" are as follows:

   const int selec = 0x77;

The following is the assembly module that is called:

extrn _selec:far               ;selec declared extrn
dgroup    group dataseg
dataseg   segment para public 'data'
dataseg   ends

codeseg   segment para public 'code'
codeseg   ends

codeseg   segment

          public _testo
_testor proc far

          extrn  _selec:far            ;selec declared extrn
          push    bp
          mov     bp,sp

          assume  ds:dgroup
          mov ax, dgroup
          mov ds, ax

          lea bx, dgroup:_selec  ;underscore added for compatibility
                                 ;with C language conventions

          mov ax, word ptr dgroup:[bx] ;viewed through CodeView ax=77H

          mov word ptr[bx], 0A8H       ;value in selec changed to A8H

          pop     bp

          ret

_testor endp

codeseg ends

     end

The following is the makefile used to compile and link the above
files:

all=1.obj 2.obj
                       ;update pseudo-target ensures a
                       ;compile and link each time make is invoked
update: 1.c
    cl /Zi /AL /c 1.c

update: 2.asm
    masm /Zi 2.asm;

update: $(all)
    link /co /M  $(all),,1,/nod llibcer;

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.

Copyright Microsoft Corporation 1986-2002.