mirror of
https://github.com/Sosokker/RISC-V-asm-programming.git
synced 2025-12-18 13:34:06 +01:00
Add sum.s
This commit is contained in:
commit
caef1d897e
104
sum.s
Normal file
104
sum.s
Normal 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
|
||||
Loading…
Reference in New Issue
Block a user