/* -------------------------------------------------- Define required labels for EGTAPI -------------------------------------------------- */ .global main, Stop, CodeEnd, DataStart, DataEnd .global head, max .global while // Let me stop at the start of while loop /* -------------------------------------------------- // Assume we have a NON-empty lsit !!! max = head.value; // first value in linked list ptr = head.next; // ptr starts at 2nd list elem while ( ptr != null ) { if ( ptr.value > max ) max = ptr.value; ptr = ptr.next; } -------------------------------------------------- */ .text main: // max = head.value; - always execute the RHS first !!! movw r0, #:lower16:head movt r0, #:upper16:head // r0 = addr(head) ldr r0, [r0] // r0 = head ldr r0, [r0] // r0 = head.value movw r1, #:lower16:max movt r1, #:upper16:max // r1 = addr(max) str r0, [r1] // max = head.value; // ptr(r10) = head.next; movw r0, #:lower16:head movt r0, #:upper16:head // r1 = addr(head) ldr r0, [r0] // r0 = head ldr r10,[r0, #4] // r10 = head.next 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 *********************************** */ // if ( ptr(r10).value > max ) //// Get ptr(r10).value (use base + offset access technique !) ldr r0, [r10, #0] // r0 = ptr(r10).value //// Get max movw r1, #:lower16:max movt r1, #:upper16:max // r1 = addr(max) ldr r2, [r1] // r2 = max; //// Compare ptr(r10).value (= r0) < max (= r2) cmp r0, r2 ble ifEnd /* ******************************************** Then-part: max = ptr(r10).value ******************************************** */ ldr r0, [r10, #0] // r0 = ptr(r10).value movw r1, #:lower16:max movt r1, #:upper16:max // r1 = addr(max) str r0, [r1] // max = A[i] ifEnd: // ptr(r10) = ptr(r10).next ldr r10, [r10, #4] // ptr(r10) = ptr(r10).next // End of while body --- branch back to test !! b while whileEnd: Stop: CodeEnd: nop /* -------------------------------------------------- Begin of the permanent program variables -------------------------------------------------- */ .data DataStart: max: .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 99, p2 // p1 contains [99, p2] p2: .4byte 78, p4 // p2 contains [78, p4] p3: .4byte -9, p1 // p3 contains [-9, p1] p4: .4byte 55, 0 // p4 contains [55, null] DataEnd: .end