// // 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: // ********************************************* // Test (1): result = square(3) // Test (2): result = square(3) + square(4) // ********************************************* mov r0, #3 bl square // r0 = 3*3 mov r9, r0 // Save result (r0) in reg r9 ????? mov r0, #4 bl square // r0 = 4*4 add r0, r9, r0 movw r1, #:lower16:result movt r1, #:upper16:result str r0, [r1] // Store result Stop: nop // Stop point of main( ) /* ---------------------------------------------------------------- Function square(x) agreed inputs: r0 = x agreed return: r0 = x*x ---------------------------------------------------------------- */ square: mov r1, r0 mul r0, r1, r0 mov r1, #0 mov r2, #0 mov r3, #0 mov r4, #0 mov r5, #0 mov r6, #0 mov r7, #0 mov r8, #0 mov r9, #0 mov r10, #0 mov pc, lr // Return to the caller CodeEnd: nop /* -------------------------------------------------- Begin of the permanent program variables -------------------------------------------------- */ .data DataStart: result: .skip 4 DataEnd: .end