/* -------------------------------------------------- Show actions of both prelude and postlude f( ): has 2 int parameters and 3 int local vars g( ): has 3 int parameters and 2 int local vars -------------------------------------------------- */ .global main, Stop, CodeEnd, DataStart, DataEnd .global f, g /* -------------------------------------------------- Begin of the program instructions -------------------------------------------------- */ .text main: mov r0, #222 // Pass 222 as parameter 2 on stack push {r0} mov r0, #111 // Pass 111 as parameter 1 on stack push {r0} bl f // Use step-in to call function f add sp, sp, #8 // De-allocate 2 int parameters nop nop /* ============================================== Function f: param and locals in stack ============================================== */ f: /* **************************************** Prelude: build stack frame **************************************** */ push {lr} // Save return address in LR push {fp} // Save Frame Pointer in FP mov fp, sp // Initialize my own FP sub sp, sp, #12 // I create 3 local variable in stack /* BODY of function f */ nop // These instructions in f( ) can use stack nop // to access parameters and local variables mov r0, #555 // Pass 555 as parameter 3 on stack push {r0} mov r0, #444 // Pass 444 as parameter 2 on stack push {r0} mov r0, #333 // Pass 333 as parameter 1 on stack push {r0} bl g // Use step-in to call function g add sp, sp, #12 // De-allocate 3 int parameters nop nop /* **************************************** Postlude: tear down stack frame **************************************** */ mov sp, fp pop {fp} pop {pc} /* ============================================== Function g: param and locals in stack ============================================== */ g: /* **************************************** Prelude: build stack frame **************************************** */ push {lr} // Save return address in LR push {fp} // Save Frame Pointer in FP mov fp, sp // Initialize my own FP sub sp, sp, #8 // I create 2 local variable in stack /* BODY of function g */ nop // These instructions in f( ) can use stack nop // to access parameters and local variables /* **************************************** Postlude: tear down stack frame **************************************** */ mov sp, fp pop {fp} pop {pc} CodeEnd: Stop: nop /* -------------------------------------------------- Begin of the permanent program variables -------------------------------------------------- */ .data DataStart: DataEnd: .end