/* -------------------------------------------------------------- Show the pass-by-reference in assembler -------------------------------------------------------------- */ .global main, Stop, CodeEnd, DataStart, DataEnd .global f, k /* -------------------------------------------------- Begin of the program instructions -------------------------------------------------- */ .text main: /* ========================================= Pass k to f( ) by value ========================================= */ movw r0, #:lower16:k movt r0, #:upper16:k // r0 = address of k push {r0} // Pass k by reference (pass k's address) bl f // Call function f add sp, sp, #4 // Clean up parameter on the stack nop nop Stop: nop /* ================================================ Function f that gets a parameter by reference Stack frame of f( ): FP--> +-----------+ | old FP | FP + 0 +-----------+ | ret addr | FP + 4 +-----------+ | addr of a | FP + 8 +-----------+ ================================================ */ 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, #0 // I create 0 local variable in stack /* ======================================= a = a + 1 ======================================= */ ldr r0, [fp, #8] // r0 = address of variable a ldr r1, [r0] // r0 = value of variable a add r1, r1, #1 // r0 = a + 1 ldr r0, [fp, #8] // r0 = address of variable a str r1, [r0] // Assign: a = a + 1 /* ************************************************ Postlude: break down stack frame ************************************************ */ mov sp, fp // De-allocate the local variables pop {fp} // Restore old FP pop {pc} // Return CodeEnd: nop /* -------------------------------------------------- Begin of the permanent program variables -------------------------------------------------- */ .data DataStart: k: .4byte 7 DataEnd: .end