// // demo3: find max value in a linked list .global main, Stop, CodeEnd, DataStart, DataEnd .global head, max .text main: // Use r0 for ptr // max=head.value movw r1,#:lower16:head movt r1,#:upper16:head ldr r1,[r1] ldr r1,[r1,#0] // r1 = head.value movw r2,#:lower16:max movt r2,#:upper16:max str r1,[r2] // max = head.value movw r1,#:lower16:head movt r1,#:upper16:head ldr r1,[r1] ldr r1,[r1,#4] // r1=head.next mov r0,r1 // ptr (r0) = head.next while: cmp r0,#0 // ptr ? null beq whileEnd ldr r1,[r0,#0] // r1 = ptr.value movw r2,#:lower16:max movt r2,#:upper16:max ldr r2,[r2] cmp r1,r2 // ptr.value ? max ble ifEnd // max = ptr.value ldr r1,[r0,#0] // r1 = ptr.value movw r2,#:lower16:max movt r2,#:upper16:max str r1, [r2] ifEnd: // ptr=ptr.next (r0 = ptr) ldr r0,[r0,#4] // ptr=ptr.next 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