Problem description:
|
Simplication: we will assume that the linked list is not empty (i.e.: head ≠ null)
Algorithm to find the maximum of a series of values:
max = first value in the serie for nextValue = 2nd, 3rd, ...., last value in serie do { if ( nextValue > max ) max = nextValue; } |
This algorithm will find the maximum value in any data structure
The only adaptation that you need to make is: use a data structure specific access method to access the value field.
Find maximum algorithm for a linked list (adjust how to find the value);
// Assume we have a NON-empty list at head !!!
int max;
List ptr;
max = head->value; // first value in linked list
ptr = head->next; // Prepare ptr to traverse the list
while ( ptr != NULL )
{
if ( ptr->value > max )
max = ptr->value;
ptr = ptr->next;
}
|
(Draw the flow chart)
Flow diagram of the find maximum program: (click to pull out)
How I created a non-empty linked list in assembler:
head: .4byte p0 // head contains the address of the first list elem // I created: head->[34]->[-9]->[99]->[78]->[55] // list structure is: [value (int), next (link)] 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] |
main: // max = head.value; - always execute the RHS first !!! movw r0, #:lower16:head movt r0, #:upper16:head ldr r0,[r0] // r0 = head ldr r0,[r0, #0] // r0 = head.value movw r1, #:lower16:max movt r1, #:upper16:max str r0,[r1] // ptr = head.next movw r0, #:lower16:head movt r0, #:upper16:head ldr r0,[r0] // r0 = head ldr r0,[r0, #4] // r0 = head.next movw r1, #:lower16:ptr movt r1, #:upper16:ptr str r0,[r1] while: // START of while loop // Test while condition ptr != null movw r0, #:lower16:ptr movt r0, #:upper16:ptr ldr r0, [r0] //r0 = ptr cmp r0, #0 beq whileEnd // If ptr == null: exit while loop /* *********************************** While body *********************************** */ // if ( ptr.value > max ) //// Get ptr.value (use base + offset access technique !) movw r0, #:lower16:ptr movt r0, #:upper16:ptr ldr r0, [r0] ldr r0, [r0, #0] // r0 = ptr.value //// Get max movw r1, #:lower16:max movt r1, #:upper16:max // r1 = addr(max) ldr r1, [r1] //// Compare ptr.value (= r0) < max (= r2) cmp r0, r1 ble ifEnd /* ******************************************** Then-part: max = ptr.value ******************************************** */ movw r0, #:lower16:ptr movt r0, #:upper16:ptr ldr r0, [r0] ldr r0, [r0, #0] // r0 = ptr.value movw r1, #:lower16:max movt r1, #:upper16:max str r0, [r1] ifEnd: // ptr = ptr.next movw r0, #:lower16:ptr movt r0, #:upper16:ptr // r0 = addr(ptr) ldr r1, [r0] ldr r1, [r1, #4] // r1 = ptr.next str r1, [r0] // End of while body --- branch back to test !! b while whileEnd: /* -------------------------------------------------- Begin of the permanent program variables -------------------------------------------------- */ .data ptr: .skip 4 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 59, p2 // p1 contains [99, p2] p2: .4byte 66, p4 // p2 contains [78, p4] p3: .4byte -9, p1 // p3 contains [-9, p1] p4: .4byte 50, 0 // p4 contains [55, null] .end |
/home/cs255001/demo/asm/7-while/max-list.s