/******************************************************* * File: par_st.m * Dir: cis235/suns/ch07 * Date: January 4, 1999 * Author: HGG * Computer: KUNET suns * Assembler: as under the gcc compiler * Compile: gcc * Execute: a.out * Purpose: To demonstrate parameter passing using * the system stack. * *******************************************************/ /****** constants and offsets **********************/ define(x, -20) ! main local variables define(y, -24) ! why start at -20? define(sum, -28) ! no problem if params on stack define(param1, +68) ! function parameters define(param2, +72) define(result, +76) .data .align 8 prompt: .asciz "Enter two integers: " .align 8 formati: .asciz "%d %d %d" formato: .asciz "f(X = %d,Y = %d, Sum = %d )\n\n" .align 8 .text .global main main: save %sp, -112 & -8, %sp loop: !while(printf(prompt), scanf(formati, &x, &y) != EOF !printf(prompt); sethi %hi(prompt), %o1 call printf,0 or %o1, %lo(prompt), %o0 ! scanf(formati, &x, &y) != eof sethi %hi(formati),%o3 or %o3,%lo(formati),%o0 add %fp,x,%o1 ! o1 = &x add %fp, sum, %o3 call scanf,0 add %fp,y,%o2 ! o2 = &y cmp %o0, -1 ! o0 == EOF? be done nop ! f(x, y, &sum) sum is a reference parameter ld [%fp + x], %o0 ! param1 = x st %o0, [%sp + param1] ld [%fp + y], %o0 ! param2 = y st %o0, [%sp + param2] add %fp, sum, %o0 ! result = &sum st %o0, [%sp + result] call f, 0 nop ! printf(formato, x, y, sum); sethi %hi(formato),%o1 or %o1,%lo(formato),%o0 ld [%fp+x], %o1 ld [%fp+y], %o2 call printf,0 ld [%fp+sum], %o3 b loop nop !********************************************************* done: ! exit call exit,0 mov 0, %o0 !********************************************************* !* The function f(param1, param2, &result) !* This function simply computes x*y + 2; !* .align 4 .global f f: save %sp,-112,%sp ld [%fp+param1],%o0 ! o0 = param1 call .mul ! o1 = param2 ld [%fp+param2],%o1 ! o0 = param1 * param2 mov 2,%o1 add %o0,%o1,%o0 ! o0 = param1 * param2 + 2 ld [%fp+result],%o1 !o1 = address in result st %o0,[%o1] ! address of result has answer ret restore