/* -------------------------------------------------- Define required labels for EGTAPI -------------------------------------------------- */ .global main, Stop, CodeEnd, DataStart, DataEnd .global head, sum .global while // Let me stop at the start of while loop /* -------------------------------------------------- ptr is a "help variable" in the program used to traverse the linked list. I will use register r10 as ptr sum = 0; r10 = head; while ( r10 != null (= 0) ) { sum = sum + r10.value r10 = r10.next } -------------------------------------------------- */ .text main: // sum = 0; - always execute the RHS first !!! mov r0, #0 // r0 = 0 - ready to save it movw r1, #:lower16:sum movt r1, #:upper16:sum // r1 = addr(sum) str r0, [r1] // sum = 0; // r10 = head; movw r0, #:lower16:head movt r0, #:upper16:head // r0 = addr(head) ldr r10, [r0] // r10 = head while: // START of while loop // Test while condition ptr (r10) != null cmp r10, #0 // Check: ptr (r10) != null beq whileEnd // If ptr(r10) == null: exit while loop /* *********************************** While body *********************************** */ // sum = sum + ptr(r10).value //// Get sum movw r0, #:lower16:sum movt r0, #:upper16:sum // r0 = addr(sum) ldr r1, [r0] // r1 = sum; //// Get ptr(r10).value (use base + offset !) ldr r2, [r10, #0] // r2 = ptr(r10).value //// compute sum + A[i] add r1, r1, r2 // r1 = sum + ptr(r10).value //// Store result in sum (in memory) movw r0, #:lower16:sum movt r0, #:upper16:sum // r0 = addr(sum) str r1, [r0] // sum = sum + ptr(r10).value // ptr = ptr.next ldr r10, [r10, #4] // r10 = ptr.next // End of while body --- branch back to test !! b while whileEnd: Stop: CodeEnd: nop /* -------------------------------------------------- Begin of the permanent program variables -------------------------------------------------- */ .data DataStart: sum: .skip 4 head: .4byte p0 // head contains the address of the first list elem // head->[34]->[-9]->[99]->[78]->[55] // list structure is: [int value, next] p0: .4byte 34, p3 // p0 contains [34, p3] p1: .4byte 59, p2 // p1 contains [99, p2] p2: .4byte 66, p4 // p2 contains [78, p2] p3: .4byte -9, p1 // p3 contains [-9, p2] p4: .4byte 50, 0 // p4 contains [55, p2] DataEnd: .end