Skip to content

Instantly share code, notes, and snippets.

@rafael-garcia
Last active April 1, 2018 22:52
Show Gist options
  • Select an option

  • Save rafael-garcia/bed3849944a1ff20f0de20c8f1ccac4b to your computer and use it in GitHub Desktop.

Select an option

Save rafael-garcia/bed3849944a1ff20f0de20c8f1ccac4b to your computer and use it in GitHub Desktop.
void rotina (int n, int* v) {
int i, temp;
int troca = 0;
for (i=0; i < n-1; i++)
if (v[i] > v[i+1]) {
temp = v[i];
v[i] = v[i+1];
v[i+1] = temp;
troca = 1;
}
if (troca != 0) && (n>1)
rotina(n-1,v);
}
ROTINA:
add $t2, $zero, $zero # troca = 0
add $t0, $zero, $zero # i = 0
addi $t3, $a0, -1 # n - 1
FOR:
slt $t4, $t0, $t3 # if i < n -1
beq $t4, $zero, FIM_FOR
sll $t5, $t0, 2 # $t5 = 4(i)
add $t5, $t5, $a1 # $t5 = endereço de v + i
addi $t6, $t5, 4 # $t6 = endereço de v + i + 1
lw $t7, 0($t5) # $t7 = v[i]
lw $t8, 0($t6) # $t8 = v[i + 1]
sub $t9, $t8, $t7 # $t9 = v[i + 1] - v[i]
slt $t9, $t9, $zero # $t9 = $t9 < 0 ?
beq $t9, $zero, INC_FOR # i++ e proxima iteracao
add $t1, $zer0, $t7 # $t1 --> temp = v[i]
sw $t8, 0($t5) # v[i] = v[i+1]
sw $t1, 0($t6) # v[i+1] = temp
addi $t2, $zero, 1 # troca = 1
INC_FOR:
addi $t0, $t0, 1
j FOR
FIM_FOR:
beq $t2, $zero, FIM_ROTINA # troca == 0, short-circuit condicional
addi $t1, $zero, 1
sub $t0, $t1, a0 # $t0 = 1 - n
slt $t0, $t0, $zero # $t0 = (1 - n) < 0?
beq FIM_ROTINA
# empilha primeiro argumento e o endereço de retorno
addi $sp, $sp, -8
sw $a0, 0($sp)
sw $ra, 4($sp)
add $a0, $zero, $t3 # atualiza arg para n - 1
jal ROTINA
# desempilha primeiro argumento e o endereço de retorno
lw $a0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 8
FIM_ROTINA:
jr $ra
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment