Fatorial em assembly

Publicado por Leonardo Weslei Diniz 10/06/2008

[ Hits: 11.915 ]

Homepage: http://www.agilesoft.com.br/

Download fatorial_exterminador3.s




Recursividade em assembly também é possível!

Fatorial em assembly.




Esconder código-fonte

#By Exterminador3
.data
   str1: .asciiz "\n\tDigite um valor : "
.text
.globl main.            #main()
main:         # Ponto de entrada...
      li $v0,4      # Pede ao utilizador o valor N
      la $a0,str1
      syscall            
      li $v0,5
      syscall             
      addi $a0,$v0,0   # Valor lido fica em a0
      jal fact      # call fact(n)
      addi $a0,$v0,0   # Escreve o resultado
      li $v0,1      
      syscall
      li $v0,10      # Fim...
      syscall

fact:
      sub $sp,$sp,8   # Ajusta a stack para 2 items
      sw $ra, 4($sp)   # Guarda endereço de retorno
      sw $a0, 0($sp)   # Guarda argumento n

      slt $t0,$a0,1   # testa se n < 1
      beq $t0,$zero,L1   # Se n >= 1, vai fazer outra chamada

      li $v0,1      # Se não for devolve 1
      add $sp,$sp,8   # liberta o espaço da stack antes de
      jr $ra      # retornar

L1:   sub $a0,$a0,1   # Nova chamada: novo argumento (n - 1)
      jal fact      # call fact com (n - 1)

         # Ponto de retorno da chamada recursiva:
      lw $a0, 0($sp)   # Recupera o argumento passado
      lw $ra, 4($sp)   # Recupera o endereço de retorno
      add $sp,$sp,8   # Liberta o espaço da stack

      mul $v0,$a0,$v0   # Calcula n * fact (n - 1)
      jr $ra            # Retorna com o resultado

Scripts recomendados

Assembler 8086 - Simples código que mostra horas e minutos em pontos

Relógio em assembly NES 8 bits (variante do 6502)

FreeBSD Execve

Escrita de um número em binário na tela em Assembly Puro para Linux x86 (Nasm - Netwide Assembler)

GAS Informações do sistema

Comentários
[1] Comentário enviado por albertguedes em 11/06/2008 - 00:33h

Ai Leonardo. Cê não tem idéia de como tem gente carente de aprender assembler decentemente aqui no VOL.
Você é um dos poucos que publicaram isso, e faço votos pela sua iniciativa.
Tive medo de faltar comentários no código, que em assembler, código sem coments é o mesmo que não ler nada do código.
Só me diz uma coisa, esse código é pra 'nasm' mesmo ?

[2] Comentário enviado por leonardoweslei em 11/06/2008 - 13:38h

Cara eu só testei msm no Spim e no Xspim, e nos dois funciona direitinho.OK

[3] Comentário enviado por HelioCampos em 12/06/2008 - 08:01h

Como assembler é dependente de máquina e sistema operacional.
Seria bom vc dar as configurações e o sistema operacional em que vc está escrevendo a rotina.

[4] Comentário enviado por leonardoweslei em 12/06/2008 - 10:24h

Tem um programa chamado SPIM (para windows, para linux é XSPIM) ele roda programas em assembler MIPS.


Contribuir com comentário