Last active
August 29, 2015 14:03
-
-
Save reinaldorauch/3beeb9052742ad8bdf5b to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
.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