DOCUMENT:Q34377 06-MAY-2001 [masm] TITLE :How to Implement a Function Pointer in MASM PRODUCT :Microsoft Macro Assembler PROD/VER::5.0,5.1,5.1a,6.0,6.0a,6.0b OPER/SYS: KEYWORDS: ====================================================================== ------------------------------------------------------------------------------- The information in this article applies to: - Microsoft Macro Assembler (MASM), versions 5.0, 5.1, 5.1a, 6.0, 6.0a, 6.0b ------------------------------------------------------------------------------- SUMMARY ======= The following sample program illustrates how to implement a function pointer using the Microsoft Macro Assembler. It takes the address of the function (in this example, the address is loaded into ES:DX) and moves it into a 4-byte variable; it then does a far call through the pointer. In this example, it may seem odd to call a function in this manner because the function is defined locally and its name is known; however, what if the name of the function was not known? What if you were programming a device driver and all that was know was the entry point of the function? Using the following technique, a name could be given to the address of the function and the function could be called like any other function. MORE INFORMATION ================ This program illustrates how to implement a function pointer in MASM. This code is similar to the code that the C compiler would generate for a C program that used a pointer to a function. Sample Code ----------- ; Assemble options needed: none .model small .data fptr dd 1 dup(?) ; set aside four bytes for function address .code ; ; MACRO Definitions ; FARCALL MACRO func_ptr CALL dword ptr func_ptr ; call by 4-byte far function reference ENDM DosExit MACRO MOV ax, 4C00h ; ah = 4Ch ( dos exit interrupt) al = 0 INT 21h ENDM ; ; FUNCTION Definition: function uses int 10h, function 07h to ; initialize a window ; PUBLIC _ClrScr _ClrScr PROC FAR PUSH bp ; save bp MOV bp, sp ; get sp PUSH bx ; save registers PUSH cx PUSH dx MOV ax, 0700h ; ah = 7, al = 0 MOV bx, 0700h ; bh = 7, bl = 0 XOR cx, cx ; cx = 0 MOV dx, 184Fh ; dh = 24, dl = 79, decimal INT 10h MOV ax, 0200h ; ah = 2, al = 0 XOR bx, bx ; bx = 0 XOR dx, dx ; dx = 0 INT 10h XOR ax, ax ; function returns void POP dx ; restore registers POP cx POP bx MOV sp, bp ; reset sp POP bp ; restore bp RET ; return _ClrScr ENDP BEGIN: ; main part of the program ; ; Get address of the function, put in es:dx ; mov dx, SEG _ClrScr mov es, dx mov dx, OFFSET _ClrScr ; ; Load function address into fptr ; mov WORD PTR fptr, dx ; low word of fptr is the ; offset of the function mov WORD PTR fptr+2, es ; high word of fptr is the ; segment of the function ; ; Call the function via a function pointer ; FARCALL fptr ; call function. FARCALL is a macro ; defined above ; ; Exit to DOS ; DosExit ; Exit to DOS. DosExit is a macro ; defined above END BEGIN Additional query words: kbinf 5.00 5.10 5.10a 6.00 6.00a 6.00b ====================================================================== Keywords : Technology : kbMASMsearch kbAudDeveloper kbMASM510 kbMASM600 kbMASM500 kbMASM600a kbMASM510a kbMASM600b Version : :5.0,5.1,5.1a,6.0,6.0a,6.0b ============================================================================= 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 2001.