How to Implement a Function Pointer in MASM (34377)



The information in this article applies to:

  • Microsoft Macro Assembler (MASM) 5.0
  • Microsoft Macro Assembler (MASM) 5.1
  • Microsoft Macro Assembler (MASM) 5.1a
  • Microsoft Macro Assembler (MASM) 6.0
  • Microsoft Macro Assembler (MASM) 6.0a
  • Microsoft Macro Assembler (MASM) 6.0b

This article was previously published under Q34377

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
				

Modification Type:MinorLast Reviewed:11/19/2003
Keywords:KB34377