Skip to content

Instantly share code, notes, and snippets.

@aflaag
Last active March 21, 2024 09:18
Show Gist options
  • Save aflaag/5b0f93078942ff69ed744d7eecee3a5c to your computer and use it in GitHub Desktop.
Save aflaag/5b0f93078942ff69ed744d7eecee3a5c to your computer and use it in GitHub Desktop.
.globl main
.text
main:
addi $a0, $a0, -3 # a0 = -3
addi $a1, $a1, 4 # a1 = 4
addi $a2, $a2, 5 # a2 = 5
addi $a3, $a3, 8 # a3 = 8
jal f # f(a0, a1, a2, a3)
move $a0, $v0 # a0 = v0
li $v0, 1 # print int
syscall
li $v0, 10 # exit
syscall
# NOTE: doesn't save ra because it
# doesn't call any other function
# fn g(a0: int, a1: int) -> (v0: int)
# return (|a0| - |a1|) ^ 2
g:
subi $sp, $sp, 8 # sp -= 8
sw $a1, 4($sp) # mem[sp] = a1
sw $a0, 0($sp) # mem[sp] = a0
abs $a0, $a0 # a0 = |a0|
abs $a1, $a1 # a1 = |a1|
sub $v0, $a0, $a1 # v0 = a0 - a1
mul $v0, $v0, $v0 # v0 *= v0
lw $a0, 0($sp) # a0 = mem[sp + 0]
lw $a1, 4($sp) # a1 = mem[sp + 4]
addi $sp, $sp, 8 # sp += 8
jr $ra
# fn f(a0: int, a1: int, a2: int, a3: int) -> (v0: int)
# return (g(a0) + g(a1)) / 2
f:
subi $sp, $sp, 20 # sp += 20
sw $s0, 16($sp) # mem[sp + 16] = s0
sw $a1, 12($sp) # mem [sp + 12] = a1
sw $a0, 8($sp) # mem[sp + 8] = a1
sw $fp, 4($sp) # mem[sp + 4] = fp
sw $ra, 0($sp) # mem[sp + 0] = ra
jal g # g(a0, a1)
move $s0, $v0 # s0 = v0
move $a0, $a2 # a0 = a2
move $a1, $a3 # a1 = a3
jal g # g(a0, a1)
add $s0, $s0, $v0 # s0 += v0
srl $s0, $s0, 1 # s0 /= 2
move $v0, $s0 # v0 = s0
lw $ra, 0($sp) # ra = mem[sp + 0]
lw $fp, 4($sp) # fp = mem[sp + 4]
lw $a0, 8($sp) # a0 = mem[sp + 8]
lw $a1, 12($sp) # a1 = mem[sp + 12]
lw $s0, 16($sp) # s0 = mem[sp + 16]
addi $sp, $sp, 20 # sp += 20
jr $ra
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment