How to Implement a Function Pointer in MASM
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, 6.0b
-
Microsoft Macro Assembler for OS/2, 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 :
Version : :5.0,5.1,5.1a,6.0,6.0a,6.0b
Platform :
Issue type :