Skip to content

Instantly share code, notes, and snippets.

@fellipecaetano
Last active March 31, 2018 22:28
Show Gist options
  • Save fellipecaetano/8970d6d5222d9b7c87f500670a407757 to your computer and use it in GitHub Desktop.
Save fellipecaetano/8970d6d5222d9b7c87f500670a407757 to your computer and use it in GitHub Desktop.
.text
.globl main
main:
addi $a0, $zero, 7
jal rot
j exit
rot:
# Check if $a0 < 2
slti $t0, $a0, 2
bne $t0, $zero, rot_return_0
# Check if $a0 == 2
addi $t0, $zero, 2
beq $t0, $a0, rot_return_1
# Preserve original argument and return address
addi $sp, $sp, -8
sw $a0, 0($sp)
sw $ra, 4($sp)
# $v0 = 1 + rot($a0 - 2)
addi $a0, $a0, -2
jal rot
addi $v0, $v0, 1
# Restore original argument and return address
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
# return $v0
jr $ra
rot_return_0:
addi $v0, $zero, 0
jr $ra
rot_return_1:
addi $v0, $zero, 1
jr $ra
exit:
@tiagobento
Copy link

tiagobento commented Mar 31, 2018

Ficou bem parecido com o meu, só mudou o fato de eu já entrar empilhando e sempre desempilhar no fim. Se liga:


j MAIN


ROT:
	addi $sp, $sp, -8
	sw $ra, 4($sp)
	sw $a0, 0($sp)
BODY:
	addi $t2, $zero, 2		#holds the value 2 (should've been initialized only once)
	slt $t0, $a0, $t2		#if n < 2
	beq $t0, $zero, ELSE1
	addi $v0, $zero, 0
	j RET
ELSE1:
	bne $a0, $t2, ELSE2		#if n == 2
	addi $v0, $zero, 1
	j RET
ELSE2:
	addi $a0, $a0, -2
	jal ROT
	lw $ra, 4($sp)
	lw $a0, 0($sp)
	addi $v0, $v0, 1
RET:
	addi $sp, $sp, 8
	jr $ra


MAIN:
	addi $s0, $zero, 6		#n = 6
	add $a0, $zero, $s0
	jal ROT
	add $s1, $zero, $v0		#result = rot(6)
	

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment