int x[100]; short y[100]; byte z[100]; int i; short j; byte k; class List { int value1; short value2; short value3; List next } List head; (head contains the start of a linked list, assume the linked list has been created and is not empty)
y[i + j] = z[ x[ k ] ] + head.value1 + head.next.value3; |
|
/* *********************************** Get z[ x[k] ] in register r10 *********************************** */ // Get byte k movw r0, #:lower16:k movt r0, #:upper16:k // r0 = addr(k) ldrsb r0, [r0] // r0 = k // Get int x[k] movw r1, #:lower16:x movt r1, #:upper16:x // r1 = base address of (int) array x add r0, r0, r0 // r0 = 2k add r0, r0, r0 // r0 = 4k (= offset to x[i]) ldr r0, [r1,r0] // r0 = x[k] // Get byte z[ x[k] ] = z[ r0 ] movw r1, #:lower16:z movt r1, #:upper16:z // r1 = base address of (byte) array z ldrsb r10, [r1,r0] // r10 = z[ x[k] ] /* **************************************** Get int head.value1 in register r9 **************************************** */ // Get pointer head movw r0, #:lower16:head movt r0, #:upper16:head // r0 = addr(head) ldr r0, [r0] // r0 = head // Get int head.value1 ldr r9, [r0, #0] // r9 = head.value1 add r10, r10, r9 // r10 = z[ x[ k ] ] + head.value1 /* ****************************************** Get short head.next.value3 in register r9 ****************************************** */ // Get pointer head movw r0, #:lower16:head movt r0, #:upper16:head // r0 = addr(head) ldr r0, [r0] // r0 = head // Get pointer head.next ldr r0, [r0, #8] // r0 = head.next // Get short head.next.value3 ldrsh r9, [r0, #6] // r9 = head.next.value3 add r10, r10, r9 // r10 = z[ x[ k ] ] + head.value1 + head.next.value3 /* ************************************* Store r10 in short y[i + j] ************************************* */ // Get int i movw r0, #:lower16:i movt r0, #:upper16:i // r0 = addr(i) ldr r0, [r0] // r0 = i // Get short j movw r1, #:lower16:j movt r1, #:upper16:j // r1 = addr(j) ldrsh r1, [r1] // r1 = j // Compute i+j add r0, r0, r1 // r0 = r0 + r1 // Get address of short y[i + j] (base = y, offset = 2*(i+j) movw r1, #:lower16:y movt r1, #:upper16:y // r1 = base address of array y add r0, r0, r0 // r0 = 2*(i+j) (offset) // Address of short y[i+j] is ready !!! // Store r10 in y[i+j] strh r10, [r1, r0] // Stores r10 in base address + offset // If you use str, you will also write the next array element !!! |
How to run the program:
|