!--------------------------------------
! sumsub8.S
! Subroutines with Many Parameters
!--------------------------------------

#define SUM_OFFSET 4
#define PARAM1_OFFSET 92
#define PARAM2_OFFSET 96
#define MAIN_LOCAL_SIZE 12

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

.section ".rodata"

pcResult:
	.asciz "The sum is %d.\n"

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

.section ".data"

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

.section ".bss"

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

.section ".text"

	.align 4

sum8:

	save	%sp, -96, %sp

	mov	%i0, %l0
	add	%l0, %i1, %l0
	add	%l0, %i2, %l0
	add	%l0, %i3, %l0
	add	%l0, %i4, %l0
	add	%l0, %i5, %l0
	ld 	[%fp + PARAM1_OFFSET], %l1	
	add	%l0, %l1, %l0
	ld 	[%fp + PARAM2_OFFSET], %l1
	add	%l0, %l1, %l0

	mov	%l0, %i0
	ret
	restore

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

	.align 4
	.global main

main:

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

	! iSum = sum8(2, 4, 6, 8, 10, 12, 14, 16);
	mov	2, %o0
	mov	4, %o1
	mov	6, %o2
	mov	8, %o3
	mov	10, %o4
	mov	12, %o5
	mov	14, %l0
	st 	%l0, [%sp + PARAM1_OFFSET]
	mov	16, %l0
	st 	%l0, [%sp + PARAM2_OFFSET]
	call	sum8
	nop
	st 	%o0, [%fp - SUM_OFFSET]

	! printf("The sum is %d.\n", iSum); 
	set	pcResult, %o0
	ld 	[%fp - SUM_OFFSET], %o1
	call	printf
	nop
	
	! return 0;
	mov	0, %i0
	ret
	restore

