ID Number: Q61590
5.10 5.10a
MS-DOS
Summary:
The following code demonstrates passing a LONG INT (4 bytes) via a
LONG pointer (4 bytes) to an assembly routine that accesses the LONG
integer.
Each integer is incremented in the assembly routine and its new value
returned to the calling C program.
More Information:
The code is as follows:
*********************************************************
#include <stdio.h>
#include <process.h>
#include<conio.h>
extern void stuff (long *, long *);
main()
{
long *n1,*n2; /*4 byte pointers*/
long int t1 = 9999999L; /*4 byte variables*/
long int t2 = 2256789L;
n1 = &t1;
n2 = &t2;
/*initial values*/
printf("The values are %ld and %ld\n ", *n1, *n2);
printf("Incrementing values...\n");
stuff(n1,n2);
/*values returned by the assembly routine*/
printf("The values are %ld and %ld\n ", *n1, *n2);
}
========================================================
.LALL
.model large,C
.data
.code
stuff proc far arg1:dword, arg2:dword
push es ;save registers
push si
les si,arg1 ;load in es:si the seg:offset of
; n1
inc word ptr es:[si]
jnc doarg2
inc word ptr es:[si+2] ;if carry then increment the high
; word of n1
doarg2:
les si,arg2 ;load in es:si the seg:offset of
; n2
inc word ptr es:[si]
jnc finis
inc word ptr es:[si+2] ;if carry then increment the high
;word of n2
finis:
pop si ;restore registers
pop es
mov sp,bp
ret
stuff endp
end
*********************************************************
*Makefile 'new':-
*
*all=1.obj 2.obj (macro for all the obj's)
*
*1.obj: 1.c (compiles the C module)
* cl /AL /c 1.c
*
*2.obj: 2.asm (assembles the Assembler module)
* masm 2.asm,,2;
*
*1.exe: $(all) (links modules with library)
* link /co $(all),,1,/nod llibcer; (emulator lib name)
*
*Command Line to run makefile: MAKE new
*
*********************************************************