/* -------------------------------------------- demo.s: recursive insert at tail of list -------------------------------------------- */ .global main, Stop, CodeEnd, DataStart, DataEnd .global head, ptr, Insert main: // head = Insert(head, ptr) // pass ptr movw r0, #:lower16:ptr movt r0, #:upper16:ptr ldr r0, [r0] //r0 = ptr push {r0} // pass head movw r0, #:lower16:head movt r0, #:upper16:head ldr r0, [r0] //r0 = head push {r0} bl Insert add sp, sp, #8 movw r0, #:lower16:head movt r0, #:upper16:head str r10, [r0] // head = Insert(head, ptr) Stop: nop // Return value in r10 Insert: // Prelude push {lr} push {fp} mov fp, sp sub sp, sp, #0 //Body ldr r0, [fp, #8] cmp r0, #0 bne else mov r0, #0 //r0=null ldr r1, [fp, #12] str r0, [r1, #4] // e.next = null ldr r10, [fp, #12] b postlude else: // call insert(head.next, e) ldr r0, [fp,#12] push {r0} ldr r0, [fp,#8] ldr r0, [r0, #4] push {r0} bl Insert add sp, sp, #8 ldr r0, [fp, #8] // r0 = head str r10,[r0, #4] // head.next ldr r10, [fp, #8] // r10 = head // Postlude postlude: mov sp, fp pop {fp} pop {pc} CodeEnd: nop /* *********************************************** Prepared variables (head, ptr, a linked list) *********************************************** */ .data DataStart: head: .4byte p0 // head = address of first list elem // head->[11]->[22]->[33]->[44]->[55] ptr: .4byte p9 // ptr points to list elem to insert // list structure is: [int value, next] p0: .4byte 11, p3 // p0 contains [11, p3] p1: .4byte 33, p2 // p1 contains [33, p2] p2: .4byte 44, p4 // p2 contains [44, p4] p3: .4byte 22, p1 // p3 contains [22, p1] p4: .4byte 55, 0 // p4 contains [55, 0] p9: .4byte 99, 0 // p9 contains [99, 0] DataEnd: .end