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.