[firebase-br] RES: Assembler

Carlos Ferreira carlos.ferreira em progen.com.br
Qua Nov 26 09:57:04 -03 2008


Quero agradecê-lo por ter me neste problema.
Muito obrigado.

Carlos 

-----Mensagem original-----
De: lista-bounces em firebase.com.br [mailto:lista-bounces em firebase.com.br] Em
nome de Sicnemelpor
Enviada em: quarta-feira, 26 de novembro de 2008 08:00
Para: FireBase
Assunto: Re: [firebase-br] Assembler

Assembly implementa qualquer coisa... Dá pra fazer recursividade sim,  
usando espaço na pilha para variáveis locais e parâmetros igual ao que os  
compiladores fazem.
Em Assembler (ou Assembly, prefiro o primeiro :D ) só existe JUMPs para  
loops e desvios. Os IFs, CASEs, WHILEs e DOs das linguagens "comuns" são  
implementados em assembly com JUMPs condicionais ou não.

A rotina não era a de cálculo de Fibonacci ou algo assim?

public static int F(int n){
    if (n<=1) return n;
    return F(n-1)+F(n-2);
}

Ficaria mais ou menos assim:
proc	fib
         subl    $16,%esp
         movl    %ebx,(%esp)
         movl    %esi,4(%esp)
         movl    %edi,8(%esp)
         movl    %eax,%ebx
         cmpl    $1,%ebx
         jnle    calcula
         movl    %ebx,%esi
         jmp     fim
calcula:
         movl    %ebx,%eax
         decl    %eax
         call    fib
         movl    %eax,%edi
         movl    %ebx,%eax
         subl    $2,%eax
         call    fib
         addl    %eax,%edi
         movl    %edi,%esi
fim:
         movl    %esi,%eax
         movl    (%esp),%ebx
         movl    4(%esp),%esi
         movl    8(%esp),%edi
         addl    $16,%esp
         ret
end	proc

Dá para deixar esta rotina mais enxuta e otimizada, fui preguiçoso, isso  
aí é o que o FreePascal gerou pra rotina acima convertida para pascal:

function fib(n: integer): integer;
begin
   if n <= 1 then
     Result := n
   else
     Result := fib(n-1) + fib(n-2);
end;

A convenção de chamada é Pascal (chamador empilha parâmetros da esquerda  
para a direita e o chamado limpa a pilha), com parâmetros passando por  
registradores (que é o mais rápido).

[]s
Nelson Sicuro

> assembly (e não assembler) não implementa recursividade...
> Você vai ter que fazer isso de forma interativa usando alguma função de  
> JUMP.
>
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use:  
> http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa



-- 
Usando o revolucionário cliente de correio do Opera:  
http://www.opera.com/mail/

______________________________________________
FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
Para saber como gerenciar/excluir seu cadastro na lista, use:
http://www.firebase.com.br/fb/artigo.php?id=1107
Para consultar mensagens antigas: http://firebase.com.br/pesquisa





Mais detalhes sobre a lista de discussão lista