|
|
/* ------------------------------------------------------- sumRange(A,a,b): returns (A[a] + A[a+1] + ... + A[b-1]) ------------------------------------------------------- */ int sumRange(int[] A, int a, int b ) { int i, s; s = 0; for (i = a, i < b; i++) s = s + A[i]; return(s); } void main( ) { int[] A = {11,12,13,14,15,16,17,18,19,20}; int x, y, z; z = sumRange(A, x, y); } |
Important note: how to pass an array to a function
|
We assume that register r0 and r1 are "free" (unused) main passes the address of the array A in the register r0 main passes the parameter x in the register r1 main passes the parameter y in the register r2 sumRange passes the return value back in the register r0 |
// Java statement: sum = sumRange(A, a, b): /* ------------------------------------------------- Pass parameter address of array A in reg r0 ------------------------------------------------- */ movw r0, #:lower16:A movt r0, #:upper16:A /* ------------------------------------------------- Pass 2nd parameter value a in reg r1 ------------------------------------------------- */ movw r1, #:lower16:a movt r1, #:upper16:a ldr r1, [r1] /* ------------------------------------------------- Pass 3nd parameter value b in reg r2 ------------------------------------------------- */ movw r2, #:lower16:b movt r2, #:upper16:b ldr r2, [r2] /* ---------------------------------------------------------------- call sum = sumRange(A, a, b) agreed inputs: r0 = addr of array A, r1 = a, r2 = b agreed return: r0 = return value ---------------------------------------------------------------- */ bl sumRange /* ----------------------------------------------------------------- Save return value (in r0) to variable sum (sum = sumRange(..)) ----------------------------------------------------------------- */ movw r1, #:lower16:sum // Do NOT use r0 !!! movt r1, #:upper16:sum // (Because r0 contains the return value) str r0, [r1] // This will store return value in sum |
/* ---------------------------------------------------------------- Function sumRange(a,b): agreed inputs: r0 = A, r1 = a, r2 = b agreed return: r0 = return value Unused registers: r3, r4, r5, r6, r7, r8, r9, r10 Use these registers as local vars: *** r3 = i, r4 = s *** Body of sumRange(A,a,b): s = 0; for (i = a, i < b; i++) s = s + A[i]; return(s); ---------------------------------------------------------------- */ sumRange: // When sumRange begins, we will have: r0 = A, r1 = a, r2 = b // s = 0; mov r4, #0 // r4(=s) = 0 // i = a; mov r3, r1 // r3(=i) = r1(=a) while: // while (i < b) cmp r3, r2 // r3 = i, r2 = b bge whileEnd // s = s + A[i]; ///// get A[i] in r10 mov r5, r3 // r5 = i (because r3 = i) add r5, r5, r5 // r5 = 2*i add r5, r5, r5 // r5 = 4*i = offset used to access A[i] ldr r10, [r0, r5] // r10 = A[i] (r0=A(base), r5=offset) add r4, r4, r10 // r4(=s) = r4(=s) + r10(=A[i]) // i++ add r3, r3, #1 // r3(=i) = r3(=i) + 1 b while // End of while body - loop back !! whileEnd: // return(s) mov r0, r4 // r0(return location) = r4(=s) // The return value is now in r0 mov pc, lr // Return to the caller |
How to run the program:
|