I will show you 4 different assembler programs programs.
These demo programs are found in the demo directory /home/cs255001/demo/asm/3-array
|
// The .text segment
.text
main:
// ============================================================ A[3]
movw r0, #:lower16:A
movt r0, #:upper16:A // r0 = base address of array A
// Address of A[3] = base addr + 3*1
ldrsb r2, [r0, #3] // Load A[3] into r2
// ============================================================ B[3]
movw r0, #:lower16:B
movt r0, #:upper16:B // r0 = base address of array B
// Address of B[3] = base addr + 3*2
ldrsh r3, [r0, #6] // Load B[3] into r3
// ============================================================ C[3]
movw r0, #:lower16:C
movt r0, #:upper16:C // r0 = base address of array C
// Address of C[3] = base addr + 3*4
ldr r4, [r0, #12] // Load C[3] into r4
// **********************************************************************
// The .data segment
// **********************************************************************
.data
A: .byte 11, 12, 13, 14, 15 // byte typed initialzied array A
.align 1
B: .2byte 111, 112, 113, 114, 115 // short typed initialzied array B
.align 2
C: .4byte 1111, 1112, 1113, 1114, 1115 // int typed initialzied array C
|
Explanation:
|
I will show you the demo in class.....
|
// The .text segment
.text
main:
// ==================== I put an arbitrary value in reg r1
mov r1, #44 // Value to be stored
// ============================================================ A[3]
movw r0, #:lower16:A
movt r0, #:upper16:A // r0 = base address of array A
// Address of A[3] = base addr + 3*1
strb r1, [r0, #3] // Store r1 into A[3] (byte)
// ============================================================ B[3]
movw r0, #:lower16:B
movt r0, #:upper16:B // r0 = base address of array B
// Address of B[3] = base addr + 3*2
strh r1, [r0, #6] // Store r1 into B[3] (short)
// ============================================================ C[3]
movw r0, #:lower16:C
movt r0, #:upper16:C // r0 = base address of array C
// Address of C[3] = base addr + 3*4
str r1, [r0, #12] // Store r1 into C[3] (int)
// **********************************************************************
// The .data segment
// **********************************************************************
.data
A: .byte 11, 12, 13, 14, 15 // byte typed initialzied array A
.align 1
B: .2byte 111, 112, 113, 114, 115 // short typed initialzied array B
.align 2
C: .4byte 1111, 1112, 1113, 1114, 1115 // int typed initialzied array C
|
Explanation:
|
I will show you the demo in class.....
This program uses a variable as array index.
|
// The .text segment
.text
main:
// ============================================================ A[3]
movw r0, #:lower16:A
movt r0, #:upper16:A // r0 = base address of array A
movw r1, #:lower16:k
movt r1, #:upper16:k // r1 = address of k
ldr r1, [r1] // r1 = value in variable k
// Comment: use ldrsh if k is short !
// use ldrsb if k is byte !
// Address of A[3] = base addr + k*1
ldrsb r2, [r0, r1] // Load A[k] into r2
// ============================================================ B[3]
movw r0, #:lower16:B
movt r0, #:upper16:B // r0 = base address of array B
movw r1, #:lower16:k
movt r1, #:upper16:k // r1 = address of k
ldr r1, [r1] // r1 = value in variable k
// Comment: use ldrsh if k is short !
// use ldrsb if k is byte !
// Address of B[3] = base addr + k*2
add r1, r1, r1 // r1 = k+k = 2*k
ldrsh r3, [r0, r1] // Load B[3] into r3
// ============================================================ C[3]
movw r0, #:lower16:C
movt r0, #:upper16:C // r0 = base address of array C
movw r1, #:lower16:k
movt r1, #:upper16:k // r1 = address of k
ldr r1, [r1] // r1 = value in variable k
// Comment: use ldrsh if k is short !
// use ldrsb if k is byte !
// Address of C[3] = base addr + k*4
add r1, r1, r1 // r1 = k+k = 2*k
add r1, r1, r1 // r1 = 2*k + 2*k = 4*k
ldr r4, [r0, #12] // Load C[3] into r4
// **********************************************************************
// The .data segment
// **********************************************************************
.data
A: .byte 11, 12, 13, 14, 15 // byte typed initialzied array A
.align 1
B: .2byte 111, 112, 113, 114, 115 // short typed initialzied array B
.align 2
C: .4byte 1111, 1112, 1113, 1114, 1115 // int typed initialzied array C
k: .4byte 3 // This value is arbitrary
|
Explanation:
|
I will show you the demo in class.....
The technique used is the same as array-ldr2.s so I won't write the whole explaning again.
I will only show you the code:
.text
main:
mov r10, #44 // Value to be stored
// ============================================================ A[3]
movw r0, #:lower16:A
movt r0, #:upper16:A // r0 = base address of array A
movw r1, #:lower16:k
movt r1, #:upper16:k // r1 = address of k
ldr r1, [r1] // r1 = value in variable k
// Comment: use ldrsh if k is short !
// use ldrsb if k is byte !
// Address of A[3] = base addr + k*1
strb r10, [r0, r1] // Store r10 in A[k] (byte)
// ============================================================ B[3]
movw r0, #:lower16:B
movt r0, #:upper16:B // r0 = base address of array B
movw r1, #:lower16:k
movt r1, #:upper16:k // r1 = address of k
ldr r1, [r1] // r1 = value in variable k
// Comment: use ldrsh if k is short !
// use ldrsb if k is byte !
// Address of B[3] = base addr + k*2
add r1, r1, r1 // r1 = k+k = 2*k
strh r10, [r0, r1] // Store r10 in B[3] (short)
// ============================================================ C[3]
movw r0, #:lower16:C
movt r0, #:upper16:C // r0 = base address of array C
movw r1, #:lower16:k
movt r1, #:upper16:k // r1 = address of k
ldr r1, [r1] // r1 = value in variable k
// Comment: use ldrsh if k is short !
// use ldrsb if k is byte !
// Address of C[3] = base addr + k*4
add r1, r1, r1 // r1 = k+k = 2*k
add r1, r1, r1 // r1 = 2*k + 2*k = 4*k
str r10, [r0, #12] // Store r10 in C[3] (int)
// ******************************************************************
// Data section
// ******************************************************************
.data
A: .byte 11, 12, 13, 14, 15 // byte typed initialzied array A
.align 1
B: .2byte 111, 112, 113, 114, 115 // short typed initialzied array B
.align 2
C: .4byte 1111, 1112, 1113, 1114, 1115 // int typed initialzied array C
k: .4byte 3 // Arbitrary value
|