// // Illustrate problem when you use registers to store important values // and call another method // /* -------------------------------------------------- Define required labels for EGTAPI -------------------------------------------------- */ .global main, Stop, CodeEnd, DataStart, DataEnd .global square /* -------------------------------------------------- Begin of the program instructions -------------------------------------------------- */ .text main: mov r0, #10 push {r0} mov r0, #2 push {r0} bl f add sp, sp, #8 movw r1, #:lower16:result movt r1, #:upper16:result str r0, [r1] Stop: nop // Stop point of main( ) /* ---------------------- f(a,b) Return output in r0 ---------------------- */ f: // <---- Caller // Prelude push {lr} push {fp} mov fp, sp sub sp, sp, #8 mov r0, #0 str r0, [fp, #-4] // s = 0 ldr r0, [fp, #8] // r0 = a str r0, [fp, #-8] // i = a while: ldr r0, [fp, #-8] // r0 = i ldr r1, [fp, #12] // r1 = b cmp r0, r1 // i ? b bge whileEnd ldr r0, [fp, #12] sub r0, r0, #1 // r0 = b-1 push {r0} ldr r0, [fp, #8] add r0, r0, #1 // r0 = a+1 push {r0} bl f add sp, sp, #8 // r0 = f(a+1,b-1) ldr r1, [fp, #-4] // r1 = s add r0, r1, r0 // r0 = s + f(a+1,b-1) add r0, r0, #1 // r0 = s + f(a+1,b-1)+1 str r0, [fp, #-4] // i++ ldr r0, [fp, #-8] add r0, r0, #1 str r0, [fp, #-8] b while whileEnd: ldr r0, [fp, #-4] // Put s in return placeholder r0 // Postlude return: mov sp, fp pop {fp} pop {pc} CodeEnd: nop /* -------------------------------------------------- Begin of the permanent program variables -------------------------------------------------- */ .data DataStart: result: .skip 4 DataEnd: .end