Linux slogan
Visite também: BR-Linux.org · Dicas-L · SoftwareLivre.org · UnderLinux

Linux banner
Linux banner
Linux banner
Linux banner


» Screenshot
Linux: BlackBox e Debian Sarge 3.1
Por otaviof

Comunidades

Assembly, passando parâmetros !

[1] Enviado em 20/09/2012 - 18:30h Assembly, passando parâmetros !
Linux user: ???
gokernel

(usa Linux Mint)


Olá pessoal !!!

Estou a quase "uma semana" tentando resolver um problema similar a este programa:


#include <stdio.h>

void teste (int a, int b, int c, int d)
{
    printf ("a: %d, b: %d, c: %d, d: %d\n", a, b, c, d);
}

void run (void)
{
    // passa o parametro 1:
    asm ("movl $100, %eax");
    asm ("movl %eax, (%esp)");

    // passa o parametro 2:
    asm ("movl $200, %eax");
    asm ("movl %eax, 4(%esp)");

    // passa o parametro 3:
    asm ("movl $300, %eax");
    asm ("movl %eax, 8(%esp)");

    // passa o parametro 4:
    asm ("movl $400, %eax");
    asm ("movl %eax, 12(%esp)");

    // agora chama a funcao

#ifdef __WIN32__
    asm ("call _teste");
#endif
#ifdef __linux__
    asm ("call teste");
#endif

    printf("FUNCAO TERMINADA\n");
}


int main (void)
{
    run ();

    // <<<<<<< aqui causa uma quabra do programa >>>>>>>

    printf ("SAINDO DO PROGRAMA COM SUCESSO\n");

    return 0;
}



Ao terminar a funcao run o programa quebra ...

Alguem saberia dizer o que esta faltando em assembly ???

Estava usando "PUSH" e depois de fazer a chamada da funcao entao incrementava a PILHA ... mas é complicado incrementar a PILHA principalmente quando faz uma chamada que é a principal chamada ...

OBS: este pequeno exemplo é apenas para tentar demonstrar o problema.

Desde ja grato por qualquer ajuda !


 

  


[2] Enviado em 20/09/2012 - 19:53h Re: Assembly, passando parâmetros !
Linux user: Paulo
paulo1205

(usa Ubuntu)


Em C, quando você chama uma função com, por exemplo, f(x, y), o compialdor gera código que PUSH do valor de cada argumento, da direita para esquerda, gera o CALL para o endereço inicial da função, e depois que a função retorna (logo após o CALL) faz algo como "ADD sizeof y + sizeof x, %esp". Se você quer usar uma função em C de dentro do seu código Assembly, tem de lembrar de usar as conveções de chamad do C.

A "rationale" para fazer fora da função a limpeza da pilha após o seu retorno é a possibilidade oferecida pelo C de ter funções com número variável de argumentos. Linguagens sem esse recurso (por exemplo, Pascal) geram código em que a limpeza da pilha fica dentro da função.

Eu nunca usei link-edição de módulos com conveções de chamada diferentes em Linux ou em outro UNIX, mas lembro que os compiladores em C para DOS costumavam ter palavras-chaves como "pascal" ou "fortran" usadas junto ao cabeçalho de algumas funções, tanto para informar sobre funções externas com chamada não-C quanto para alterar a convenção de chamada de uma função definida num módulo em C.

 

[3] Enviado em 20/09/2012 - 19:59h Re: Assembly, passando parâmetros !
Linux user: Paulo
paulo1205

(usa Ubuntu)


Outra possibilidade (gambiarra?) é você manipular a pilha dentro da própria função chamada. Parece que existe uma variação de RET que permite especificar um valor fixo a ser somado a ESP logo após pegar o endereço de retorno da pilha, e o retorno da função do próprio C (quando se fecham as chaves da função, por exemplo) seria desperdiçado.

Ainda mais uma possibilidade é você criar uma macro (ou função inline, se o seu compilador permitir) que encapsule a chamada à função real e a limpeza da pilha.

 

[4] Enviado em 20/09/2012 - 20:18h Re: Assembly, passando parâmetros !
Linux user: ???
gokernel

(usa Linux Mint)



Olá Paulo, grato por participar !!!

Usava este codigo depois da chamada da funcao:
----------------------------------------------
asm ("add stack_count, %esp"); // undo stack
----------------------------------------------

O problema eh que chamo uma funcao similar ao do GKT ( gtk_main ) com um parametro, e nao tem como "incrementar" a PILHA, pois essa funcao eh a principal(loop) e ainda chama outras funcoes( sem terminar a principal )...

Como é esse "rationale" ???





 

[5] Enviado em 20/09/2012 - 20:22h Re: Assembly, passando parâmetros !
Linux user: Paulo
paulo1205

(usa Ubuntu)


"Rationale" é tão somente uma explicação racional de uma escolha. Acho que é uma palavra nativa em Inglês (pelo menos ela se vê muito na documentação do POSIX), para a qual não me ocorreu sinônimo em Português.

Com relação à tal função que você chama, não entendi o problema. Tem como você mostrar o código específico?

 

[6] Enviado em 20/09/2012 - 20:25h Re: Assembly, passando parâmetros !
Linux user: Paulo
paulo1205

(usa Ubuntu)


Acabei de ver que o GCC tem um atributo que pode ser colocado nas funçãoes que especifica outra convenção de chamada. Tal atributo é stdcall.

Este artigo na Wikipedia talvez também lhe interesse: http://en.wikipedia.org/wiki/X86_calling_conventions.

 

[7] Enviado em 20/09/2012 - 20:45h Re: Assembly, passando parâmetros !
Linux user: Paulo
paulo1205

(usa Ubuntu)


E há ainda outros atributos relativo à conevnção de chamada, tais como fastcall, thiscall. Só que eu fiquei com a impressão de que essas convenções talvez não funcionem em arquitetura x86_64.

Recomendo você fazer testes com a opção -S, que gera o Assembly correspondente ao código em C, e comparar as diferentes opções.

 

[8] Enviado em 20/09/2012 - 20:55h Re: Assembly, passando parâmetros !
Linux user: ???
gokernel

(usa Linux Mint)



Eu pensei que o "rationale" fosse alguma funcao em C, ahahahahah ;).

Sobre a funcao que falei, é que estou utilizando um BYTECODE+LANGUAGE_SCRIPT que utiliza assembly para passagem de parametros, e utiza um script +ou- assim:



// Isto eh um script ....

function func_help()
{
  help(1); // aqui eh uma C funcao ... incrementa a PILHA ao ser chamada
}

pvoid win;

  AS_app_init (0,0);

  $win = window(100, 100, 400, 300, "Simples Janela");

  // ao clicar neste botao chamaria a funcao ( help(); )
  // O PROBLEMA: ... help() teria de "incrementar" a PILHA
  //
  button (100, 170, 150, 25, "Help", win, "func_help");

  // <<<<<< LOOP PRINCIPAL ... PROBLEMA: nao pode incrementar a pilha ...
  // MOTIVO: ... pois fica neste loop ate finalizar o programa
  //
  AS_app_run(0); // <<<<<<<<<< Loop Principal



Parte do codigo em C pode ser visto aqui:
http://codepad.org/LBGnSsRo



 

[9] Enviado em 21/09/2012 - 00:49h Re: Assembly, passando parâmetros !
Linux user: Paulo
paulo1205

(usa Ubuntu)


Eu não sei se entendi bem o problema.

No código que você mostrou por último, parece-me claro que quando func_help(), que é da linguagem de script, chama help(), que é em C, o interpretador do script é que deveria se adaptar às exigências da função chamada. Em outras palavras, se a linguagem de scripts se propõe a importar funções de outra linguagem, deveria saber falar o que essa linguagem espera ouvir.

Não ficou claro, mas eu fiquei com a impressão de que é você que está implementando uma linguagem de script com bytecode. É isso, e o problema está sendo justamente fazer essa "cola"?

Em tempo: gostei do primeiro agradecimento no seu código em C. Não é sempre que se vê esse tipo de coisa no meio de Informática.

 

[10] Enviado em 21/09/2012 - 04:34h Re: Assembly, passando parâmetros !
Linux user: ???
gokernel

(usa Linux Mint)


@paulo:
"Em tempo: gostei do primeiro agradecimento no seu código em C. Não é sempre que se vê esse tipo de coisa no meio de Informática."

Curti o seu comentário ...



É tipo assim:
-------------------------------------------------
Honra, glória, ... em primeiro lugar para DEUS sempre. \o/
-------------------------------------------------

Pois ele é o provedor:
-------------------------------------------------
Daniel: capítulo 2 (20 - 21).
-------------------------------------------------


 

[11] Enviado em 21/09/2012 - 10:29h Re: Assembly, passando parâmetros !
Linux user: Paulo
paulo1205

(usa Ubuntu)


Eu preciso colocar uns 'Soli Deo Gloria' nos meus programas, também.

De qualquer forma, e quanto ao assunto técnico?

 

[12] Enviado em 22/09/2012 - 10:15h Re: Assembly, passando parâmetros !
Linux user: ???
gokernel

(usa Linux Mint)



@paulo1205:
"De qualquer forma, e quanto ao assunto técnico? "

É o seguinte:
Por esse meu projeto ( JBC ) ser inicialmente aberto/livre então tenho a liberdade de usar "comentários" levando para o meu lado pessoal ...

Mas se tratando de trabalhor pagos a ética manda "dançar conforme a música" ... ou seja é bom se "comportar" adequadamente levando em conta o lado do cliente ...

Não convem fazer trabalho para um cliente e depois ser tachado de:
""ÔH CARA CHATO(usando comentários pessoais), SÓ PODIA SER UM CRENTE ..."" ;) ;) ;) ... isto so afastaria as pessoas ...

Não sei se respondi bem a sua pergunta.

Paz e graça !!!



 

  
<< Primeira | Anterior Próxima | Última >>
Responsável pelo site: Fábio Berbert de Paula - Conteúdo distribuído sob licença GNU FDL
Site hospedado por:

Viva o Linux

A maior comunidade Linux da América Latina! Artigos, dicas, tutoriais, fórum, scripts e muito mais. Ideal para quem busca auto-ajuda em Linux.