How to Implement a Function Pointer in MASM

Last reviewed: January 23, 1995
Article ID: Q34377
The information in this article applies to:
  • Microsoft Macro Assembler for MS-DOS, versions 5.0, 5.1, 5.1a, 6.0, 6.0a, and 6.0b
  • Microsoft Macro Assembler for OS/2, versions 5.0, 5.1, 5.1a, 6.0, 6.0a, and 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 reference words: kbinf 5.00 5.10 5.10a 6.00 6.00a 6.00b
KBCategory: kbprg
KBSubCategory: MASMLngIss


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: January 23, 1995
© 1998 Microsoft Corporation. All rights reserved. Terms of Use.