Fatorial em assembly

Publicado por Leonardo Weslei Diniz 10/06/2008

[ Hits: 22.102 ]

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

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

Escrita de um número em binário na tela em Assembly Puro para Linux x86 (GNU Assembly)

"Clear Screen" para Linux 64 bits em Assembly Puro (GNU Assembly)

Inverter uma string, Assembly8086

Retorna a diferença entre dois vetores em Assemly


  

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.

[5] Comentário enviado por saulobr88 em 02/09/2015 - 16:51h

Oi Leonardo,

Eu estou estudando Assembly MIPS, tive que fazer algumas alterações no seu Script para funcionar no Simulador MARS, vou deixar o Script disponível aqui no Vol.

http://www.vivaolinux.com.br/script/Fatorial-Assembly-MIPS/


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts