// // Illustrate allocating some unused registers as local variables of function // // // /* -------------------------------------------------- Define required labels for EGTAPI -------------------------------------------------- */ .global main, Stop, CodeEnd, DataStart, DataEnd .global Pause, sumRange .global WhileEnd /* -------------------------------------------------- Begin of the program instructions -------------------------------------------------- */ .text main: // sum = sumRange(A, 0, 4): mov r0, #4 push {r0} mov r0, #0 push {r0} movw r0, #:lower16:A movt r0, #:upper16:A push {r0} bl sumRange // Return value in r0 add sp, sp, #12 // clean up parameters movw r1, #:lower16:sum movt r1, #:upper16:sum str r0, [r1] Pause: // sum = sumRange(B, a, b): movw r0, #:lower16:b movt r0, #:upper16:b // r0 = addr(b) ldr r0, [r0] // r0 = b push {r0} movw r0, #:lower16:a movt r0, #:upper16:a // r0 = addr(a) ldr r0, [r0] // r0 = a push {r0} movw r0, #:lower16:B movt r0, #:upper16:B push {r0} bl sumRange // Return value in r0 add sp, sp, #12 // clean up parameters movw r1, #:lower16:sum movt r1, #:upper16:sum str r0, [r1] Stop: nop // Stop point of main( ) /* ---------------------------------------------------------------- Function sumRange(A,a,b): Stack frame structure: i -8 <-------------- SP s -4 old FP <--------------------------------- FP old LR (ret addr) A +8 a +12 b +16 Body of sumRange(A,a,b): s = 0; for (i = a, i < b; i++) s = s + A[i]; return(s); ---------------------------------------------------------------- */ sumRange: // Prelude push {lr} push {fp} mov fp, sp sub sp, sp, #8 // BODY // s = 0 mov r0, #0 str r0, [fp, #-4] // s = 0 // i = a ldr r0, [fp, #12] // r0 = a str r0, [fp, #-8] // i = a While: ldr r0, [fp, #-8] // r0 = i ldr r1, [fp, #16] // r1 = b cmp r0, r1 bge WhileEnd // s = s + A[i] ldr r0, [fp, #-4] // r0 = s ldr r1, [fp, #8] // r1 = A (base) ldr r2, [fp, #-8] // r2 = i add r2, r2, r2 add r2, r2, r2 // r2 = 4*i (offset) ldr r1, [r1, r2] // r1 = A[i] add r0, r0, r1 // r0 = s + A[i] str r0, [fp, #-4] // i = i + 1 ldr r0, [fp, #-8] add r0, r0, #1 str r0, [fp, #-8] b While WhileEnd: ldr r0, [fp, #-4] // put return value in r0 // Postlude - return to caller mov sp, fp // de-allocate local vars pop {fp} // restore fp for caller function pop {pc} // return CodeEnd: nop /* -------------------------------------------------- Begin of the permanent program variables -------------------------------------------------- */ .data DataStart: A: .4byte 11, 12, 13, 14, 15, 16, 17, 18, 19 , 20 B: .4byte 1, 2, 3, 4, 5, 6, 7, 8, 9 , 10 a: .4byte 1 b: .4byte 3 sum: .4byte -1 DataEnd: .end