[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