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:
|