Skip to content

Instantly share code, notes, and snippets.

@reinaldorauch
Last active August 29, 2015 14:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save reinaldorauch/3beeb9052742ad8bdf5b to your computer and use it in GitHub Desktop.
Save reinaldorauch/3beeb9052742ad8bdf5b to your computer and use it in GitHub Desktop.
.data 0x10000000
.globl v
v:
.word 2,5,3,7,1,9,4,6,10,8 # Array com dados
.text # Diz que é a seção de código do arquivo
.globl main # Aponta para o início do programa
main:
subu $sp, $sp, 4 # Subtrai 4 do endereço da pilha
sw $ra, 0($sp) # Guarda o Return Address no começo da pilha
la $a0, v # carrega o endereço base do array no $a0 (argument 0)
li $a1, 10 # Carrega o valor imediato 10 no $a1 (argument 1)
jal srt # Pula para o label srt e guarda o return address daqui em $ra
lw $ra, 0($sp) # Retira um valor da pilha (pop) e o usa como sendo um valor de Return adress
addi $sp, $sp, 4 # Adiciona 4 ao $sp para diminuir o espaço da pilha
jr $ra # Pula para aonde o $ra aponta, o fim do programa
tro:
sll $t0, $a1, 2
add $t1, $a0, $t0
lw $t2, 0($t1)
lw $t3, 4($t1)
sw $t2, 4($t1)
sw $t3, 0($t1)
jr $ra
srt:
subu $sp, $sp, 16 # Subtrai 16 do ponteiro da pilha para adicionar valores
sw $ra, 12($sp) # Salva o $ra desta função no offset 12 do $sp (1º espaço disponível na pilha)
sw $a1, 8($sp) # Salva o arumento 1 no offset 8 do $sp (2º espaço disponível na pilha)
sw $s0, 4($sp) # Salva o registrador $s0 no offset 4 de $sp (3º espaço disponível na pilha)
sw $s1, 0($sp) # Salva o valor de $s1 no offset 0 de $sp (4º espaço disponível na pilha)
#corpo da rotina
add $s0, $zero, $zero # Reseta o valor de $s0 para 0
for1:
slt $t0, $s0, $a1 # Se $s0 for menor que $a1, $t0 recebe 1. Caso contrário, recebe 0
beq $t0, $zero, saida1 # Se $t0 for iqual a $zero, realiza a saída1, se não, continua
addi $s1, $s0, -1 # adiciona -1 à $s0 e salva em $s1
for2:
slt $t0, $s1, $zero # Se $s1 for menor que $zero, $t0 recebe 1, se não, recebe 0
bne $t0, $zero, saida2 # Se $t0 for $sero, vai para saída2, se não, continua a execução
sll $t1, $s1, 2 # multiplica o valor em $s1 por 4
add $t2, $t1, $a0 # Soma os valores $t1 e $a0 e salva-os em $t2
lw $t3, 0($t2) # carrega o valor em 0($t2) para $t3
lw $t4, 4($t2)
slt $t0, $t3, $t4
beq $t0, $zero, saida2
move $a1, $s1
jal tro
lw $a1, 8($sp)
addi $s1, $s1, -1
j for2 # recomeça o for2
saida2:
addi $s0, $s0, 1
j for1
saida1:
lw $s1, 0($sp)
lw $s0, 4($sp)
lw $ra, 12($sp)
addi $sp, $sp, 16
jr $ra
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment