Addition of Array
Programming assignment 1
Create an assembly language program that will have two arrays, of five elements each.
Sum the corresponding elements in the two arrays together and store the result in the ‘a’ array. Do this for each element. In other words:
a[0] = a[0] + b[0]
a[1] = a[1] + b[1]
a[2] = a[2] + b[2]
a[3] = a[3] + b[3]
a[4] = a[4] + b[4]
You must use one register to load the ‘a’ values into and one register to load the ‘b’ values into. And you must use a loop to load and add together each pair of ‘a’ and ‘b’ values.
When this is complete, add together all of the values in the ‘a’ array, and store that value in memory.
The values in each array at the start should be: 1, 2, 3, 4,5: a[0] = b[0] = 1
a[1] = b[1] = 2
a[2] = b[2] = 3
a[3] = b[3] = 4
a[4] = b[4] = 5
The code that adds the two arrays together and then sums the elements together is to be in a separate sub-routine.
Programming assignment 2
Create a program that will display a 2-digit number in the output window of ARC tools.
ARC IO can only send one character at a time to the output window. So, you will need to parse the number into individual digits.
To parse the number, the number (stored in a variable in memory) will have to be brought into the CPU registers and separate the number in tens position and number in one’s position. Then code will send the number in the tens position on the output window followed by the number in the one's position
Expected Output:
To display 75 in the output window:
To display 5 in the output window:
Solution:
Program 1.asm:
.begin
.org 2048 ! start program at address 2048
a_start .equ 3008 ! set start address of array a
b_start .equ 3028 ! set start address of array b
ld [addr_a], %r1 ! load a address in r1
ld [addr_b], %r2 ! load b address in r2
ld [length], %r3 ! load length in r3
call add_arrays ! call sub-routine to add arrays
ld [addr_a], %r1 ! load a address in r1
ld [length], %r2 ! load length in r2
call sum_array ! sum all elements of array a
st %r3, [sum] ! save sum in memory
halt ! halt program
! Subroutine to add arrays
! %r1 = start address of first array
! %r2 = start address of second array
! %r3 = length of both arrays (they are the same length)
! saves the sum in first array
add_arrays:
ld [%r1 + %r0], %r4 ! load value from a
ld [%r2+ %r0], %r5 ! load value from b
addcc %r4, %r5, %r4 ! add values
st %r4, [%r1 + %r0] ! save result in a
addcc %r1, 4, %r1 ! advance position in array a
addcc %r2, 4, %r2 ! advance position in array b
addcc %r3, -1, %r3 ! decrement length
bne add_arrays ! repeat while not zero
jmpl %r15 + 4, %r0 ! return to caller
! Subroutine to sum all elements in array
! %r1 = start address of array to sum
! %r2 = length of array
! Returns sum in %r3
sum_array:
andcc %r0, %r0, %r3 ! start sum in zero
sum_loop:
ld [%r1 + %r0], %r4 ! load value from array
addcc %r4, %r3, %r3 ! add value to sum
addcc %r1, 4, %r1 ! advance position in array
addcc %r2, -1, %r2 ! decrement length
bne sum_loop ! repeat while not zero
jmpl %r15 + 4, %r0 ! return to caller
length: 5 ! length of a and b arrays
addr_a: a_start ! start address of a
addr_b: b_start ! start address of b
.org a_start ! start of array a
a: 1
2
3
4
5
.org b_start ! start of array b
b: 1
2
3
4
5
sum: 0
.end
Program 2.asm:
.begin
num_start .equ 3008 ! set start address of number
BASE .equ 0x3fffc0 !Starting point of the memory mapped region
COUT .equ 0x0 !0xffff0000 Console Data Port
COSTAT .equ 0x4 !0xffff0004 Console Status Port.
.org 2048 ! start program at address 2048
ld [number], %r1 ! load number in r1
andcc %r0, %r0, %r2 ! start with tens position in 0
div_loop:
addcc %r1, -10, %r3 ! subtract 10 from number
bneg div_end ! if < 0, end
addcc %r2, 1, %r2 ! else, increment tens position
addcc %r3, %r0, %r1 ! save remainder in r1
ba div_loop ! repeat loop
div_end:
sethi BASE, %r3 ! load base address of mmio in r3
! wait to print first digit
Wait1: ldub [%r3+COSTAT], %r4 ! load status for console
andcc %r4, 0x80, %r4 ! test ready bit
be Wait1 ! if not ready, wait
addcc %r2, 48, %r2 ! convert digit to ascii
stb %r2, [%r3+COUT] ! Print to console tens digit
! wait to print second digit
Wait2: ldub [%r3+COSTAT], %r4 ! load status for console
andcc %r4, 0x80, %r4 ! test ready bit
be Wait2 ! if not ready, wait
addcc %r1, 48, %r1 ! convert digit to ascii
stb %r1, [%r3+COUT] ! Print to console ones digit
halt ! halt program
.org num_start ! address of number
number: 5 ! number to print
.end