Skip to content

Instantly share code, notes, and snippets.

@aflaag
Created June 19, 2022 20:13
Show Gist options
  • Save aflaag/2bc2a216e0e5726c562a543de7d3a975 to your computer and use it in GitHub Desktop.
Save aflaag/2bc2a216e0e5726c562a543de7d3a975 to your computer and use it in GitHub Desktop.
.globl main
.data
N: .word 3
M: .word 0, 1, 2, 3, 4, 5, 6, 7, 8
.text
main:
la $a0, M # a0 = M pointer
lw $a1, N # a1 = N = 3
jal sommaScacchiera # v0, v1 = sommaSchacchiera(a0, a1)
move $a0, $v0 # a0 = v0
li $v0, 1 # print int
syscall
move $a0, $v1 # a0 = v1
li $v0, 1 # print int
syscall
li $v0, 10 # exit
syscall
# v0, = sommaScacchiera(a0: pointer, a1: int)
sommaScacchiera:
# push stack
subi $sp, $sp, 8
sw $fp, 4($sp)
sw $ra, 0($sp)
jal sommaPari # v0 = sommaPari(a0, a1)
jal sommaDispari # v0 = sommaDispari(a0, a1)
# pop stack
lw $ra, 0($sp)
lw $fp, 4($sp)
addi $sp, $sp, 8
jr $ra
# v0 = sommaPari(a0: pointer, a1: int)
sommaPari:
# push stack
subi $sp, $sp, 4
sw $ra, 0($sp)
# index
move $t1, $zero # t1 = 0
# result register
move $v0, $zero # v0 = 0
# evaluate exit condition, t2 = N * N * 4
mul $t2, $a1, $a1 # lo = a1 * a1 (result gets stored in lo)
mflo $t2 # t2 = lo
sll $t2, $t2, 2 # t2 <<= 2, t2 *= 4
# temp var
move $t4, $zero
loopPari:
bgt $t1, $t2, exitPari # while t1 < t2
add $t4, $a0, $t1 # t4 = a0 + t1, M_pointer + index
lw $t3, 0($t4) # t3 = mem[t4]
add $v0, $v0, $t3 # v0 += t3
addi $t1, $t1, 8 # t1 += 8
j loopPari
exitPari:
# pop stack
lw $ra, 0($sp)
addi $sp, $sp, 4
jr $ra
# v1 = sommaDispari(a0: pointer, a1: int)
sommaDispari:
# push stack
subi $sp, $sp, 4
sw $ra, 0($sp)
# index, t1 = 4
move $t1, $zero # t1 = zero
addi $t1, $t1, 4 # t1 += 4
# result register
move $v1, $zero # v0 = 0
# evaluate exit condition, t2 = N * N * 4
mul $t2, $a1, $a1 # lo = a1 * a1 (result gets stored in lo)
mflo $t2 # t2 = lo
sll $t2, $t2, 2 # t2 <<= 2, t2 *= 4
# temp var
move $t4, $zero # t4 = 0
loopDispari:
bgt $t1, $t2, exitDispari # while t1 < t2
add $t4, $a0, $t1 # t4 = a0 + t1, M_pointer + index
lw $t3, 0($t4) # t3 = mem[t4]
add $v1, $v1, $t3 # v1 += t3
addi $t1, $t1, 8 # t1 += 8, skipping 1 value
j loopDispari
exitDispari:
# pop stack
lw $ra, 0($sp)
addi $sp, $sp, 4
jr $ra
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment