!--------------------------------------
! fnptr.S
! Function Pointers
!--------------------------------------

#define PF1_OFFSET 4
#define PF2_OFFSET 8
#define MAIN_LOCAL_SIZE 8

!--------------------------------------

.section ".rodata"

pcHello:
	.asciz "Hello "

pcWorld:
	.asciz "world.\n"

!--------------------------------------

.section ".data"

!--------------------------------------

.section ".bss"

!--------------------------------------

.section ".text"

	.align 4

printHello:

	save	%sp, -96, %sp

	! printf("Hello "); 
	set	pcHello, %o0
	call	printf
	nop

	ret
	restore

!--------------------------------------

	.align 4

printWorld:

	save	%sp, -96, %sp

	! printf("world\n."); 
	set	pcWorld, %o0
	call	printf
	nop

	ret
	restore

!--------------------------------------

	.align 4
	.global main

main:

	save	%sp, (-92 - MAIN_LOCAL_SIZE) & -8, %sp

	! pf1 = printHello; 
	set	printHello, %l0
	st 	%l0, [%fp - PF1_OFFSET]

	! pf2 = printWorld; 
	set	printWorld, %l0
	st 	%l0, [%fp - PF2_OFFSET]

	! (*pf1)();
	ld 	[%fp - PF1_OFFSET], %l0
	! jmpl	%l0, %o7
	call	%l0
	nop

	! (*pf2)();
	ld 	[%fp - PF2_OFFSET], %l0
	! jmpl	%l0, %o7
	call	%l0
	nop
	
	! return 0;
	mov	0, %i0
	ret
	restore

