Add sum.s

This commit is contained in:
Sirin Puenggun 2024-03-04 10:53:39 +07:00 committed by GitHub
commit caef1d897e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

104
sum.s Normal file
View File

@ -0,0 +1,104 @@
.data
arr1: .word 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
arr2: .word 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
newline: .string "\n"
.text
main:
# Registers NOT to be used x0 to x4 and x10 to x17; reason to be explained later
# Registers that we can use x5 to x9 and x18 to x31; reason to be explained later
#int size=10, i, sum1 = 0, sum2 = 0;
addi x5, x0, 10 # let x5 be size and set it to 10
addi x6, x0, 0 # let x6 be sum1 and set it to 0
addi x7, x0, 0 # let x7 be sum2 and set it to 0
# for(i = 0; i < size; i++)
# arr1[i] = i + 1;
addi x8, x0, 0 # let x8 be the i and set it to 0
la x9, arr1 # loading the address of arr1 to x9
loop1:
bge x8, x5, exit1 # checl if i >= size, if so goto exit1
# we need to calculate &arr1[i]
# we need the base address of arr1
# then, we add an offset of i*a to the base address
slli x18, x8, 2 # set x18 to i*4
add x19, x18, x9 # add i*4 to the base address off arr1 and put it to x19
addi x20, x8, 1 # set x20 to i + 1
sw x20, 0(x19) # arr1[i] = i + 1
addi x8, x8, 1 # i++
j loop1
exit1:
# for(i = 0; i < size; i++)
# arr2[i] = 2*i;
addi x8, x0, 0 # set i to zero
la x21, arr2 # loading the address of arr2 to x21
loop2:
bge x8, x5, exit2 # checl if i >= size, if so goto exit1
# we need to calculate &arr2[i]
# we need the base address of arr1
# then, we add an offset of i*a to the base address
slli x18, x8, 2 # set x18 to i*4
add x19, x18, x21 # add i*4 to the base address off arr1 and put it to x19
add x20, x8, x8 # set x20 to i + i (2*i)
sw x20, 0(x19) # arr2[i] = 2*i
addi x8, x8, 1 # i++
j loop2
exit2:
# for(i = 0; i < size; i++) {
# sum1 = sum1 + arr1[i];
# sum2 = sum2 + arr2[i];
# }
addi x8, x0, 0 # set i to zero
loop3:
bge x8, x5, exit3 # check if i >= size, if so exit3
# sum1 + arr1[i]
# need &arr1[i]
slli x18, x8, 2 # set x18 to i*4
add x19, x18, x9 # add i*4 to the base address off arr1 and put it to x19
lw x20, 0(x19) # x20 has arr1[i]
add x6, x6, x20 # sum1 = sum1 + arr1[i]
# sum2 + arr2[i]
add x19, x18, x21 # add i*4 to the base address off arr2 and put it to x19
lw x20, 0(x19)# x20 has arr2[i]
add x7, x7, x20 # sum2 = sum2 + arr2[i]
addi x8, x8, 1 # i++
j loop3
exit3:
# print_int; sum1
addi a0, x0, 1
add a1, x0, x6
ecall
# print a newline character; use print_string
addi a0, x0, 4
la a1, newline
ecall
# print_int; sum2
addi a0, x0, 1
add a1, x0, x7
ecall
# print a newline character; use print_string
addi a0, x0, 4
la a1, newline
ecall
# exit cleanly
addi a0, x0, 10
ecall