! declare a 2-D array of integers; initialize each position to the
! sum of its row/colmn position; use zero based indexing
.data
.set ROWS, 6
.set COLS, 6
array: .skip (ROWS*COLS)*4
.text
start:
set array, %r2 ! get base address of array
set 0, %r3 ! initialize i index
set 0, %r4 ! initialize j index
i_loop: cmp %r3, ROWS ! are we done looking at the rows?
bge end_i_loop
nop
j_loop: cmp %r4, COLS ! per the current row, are we done looking at the cols?
bge end_j_loop
! compute a total offset from the base address to the current i,j element
umul %r3, ROWS, %r7 ! compute i (ROW) offset from base address
sll %r7, 2, %r7
sll %r4, 2, %r8 ! compute j (COL) offset from base address
add %r7, %r8, %r1 ! compute total offset from base address
add %r3, %r4, %r5 ! compute sum of indexes
st %r5, [%r2+%r1] ! initialize array element to sum of indexes
! verify what has just been done:
! pull out array element back out from memory, load into %r8
! and print out the contents to the console output
ld [%r2+%r1], %r8 ! pull array element into register
cmp %r8, 10 ! (ugly) little hack to print out a 10 in decimal
bl printout
nop
set '1', %r8 ! print out for ten hardcoded for this problem
ta 1 ! code is not generic!
mov %g0, %r8
printout: add %r8, '0', %r8
ta 1 ! print it as a check
mov 0x20, %r8 ! 0x20 is the hex rep of an ascii space character
ta 1
add %r4, 1, %r4 ! increment j index
ba j_loop ! continue to loop through the columns of the current row
nop ! yuck: can't think of anything useful to do here
end_j_loop: add %r3, 1, %r3 ! increment i index
mov 0x0a, %r8 ! 0x0a is the hex rep of an ascii newline character
ta 1
ba i_loop ! continue to loop through the rows
set 0, %r4 ! reset j (COL) index
end_i_loop:
ta 0